Flutter: эффективный способ вставки списка данных в базу данных - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть cities таблица и я пытаюсь вставить город при создании базы данных.Структура таблицы довольно проста, она имеет только столбцы id и name.

В onCreate методе моего класса базы данных я создаю таблицу с помощью этой команды:

var tblCities = 'cities';
await db.execute('CREATE TABLE $tblCities (id INTEGER PRIMARY KEY, name TEXT)');

У меня есть Cities класс модели с fromMap и toMap методами.

Есть около 350 городов, и я хотел вставить их в таблицу.

Q. Какой самый лучший и простой способ сделать это?

Мне приходит в голову:

  1. создание списка города
  2. с использованием цикла for для итерации всего списка
  3. создание карты города с использованием toMap метода
  4. , вызывающего db.insert метод внутри цикла

Я не уверен, но это кажется глупым подходом, поэтому думаю о лучшем и оптимизированном решении ...

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Как уже упоминалось @chunhunghan, вы можете использовать пакет для вставки больших объемов данных.

Вот пошаговое руководство:

  1. Подготовьте файл json, например, cities.json (создайте файл данных в формате csv и используйте преобразователь csv в json, например, this )
  2. Добавьте cities.json файл в каталог assets
  3. Определите его в pubspec.yaml следующим образом:

    assets:
     - assets/cities.json
    
  4. Вставьте этот код в onCreate метод вашего класса базы данных (убедитесь, что он был создан после создания таблицы)

    Batch batch = db.batch();
    
    String citiesJson = await rootBundle.loadString('assets/json/cities.json');
    List citiesList = json.decode(citiesJson);
    
    
    citiesList.forEach((val) {
      //assuming you have 'Cities' class defined
      Cities city = Cities.fromMap(val);
      batch.insert(tblCities, city.toMap());
    });
    
    batch.commit();
    

Вот и все!:)

0 голосов
/ 24 сентября 2019

Есть поддержка Batch
Чтобы избежать пинг-понга между дротиком и собственным кодом, вы можете использовать Batch:

batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();

официальный пример https://github.com/tekartik/sqflite/blob/master/sqflite/example/lib/batch_test_page.dart

В вашем случаедля списка циклов с командой batch.insert проще поддерживать
для простоты синтаксиса, используйте toMap, пример

batch.insert("cities", city.toMap());   

detail https://www.techiediaries.com/flutter-sqlite-crud-tutorial/

Если вы предпочитаете rawInsert, пожалуйста, обратитесь Вставить несколько записей в Sqflite

0 голосов
/ 24 сентября 2019

Вы можете написать необработанный запрос, чтобы вставить все данные сразу в базу данных.

...