Flutter:在数据库中插入数据列表的有效方法

Ale*_*ena 7 bulkinsert dart flutter sqflite

我有cities表并试图在创建数据库时插入城市。表结构非常简单,只有id和name列。

在onCreate我的数据库类的方法中,我使用以下命令创建表:

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

我有Cities模型类fromMap和toMap方法。

大约有 350 个城市,我想将它们插入表格中。

问:最好且最简单的方法是什么?

这在我脑海中浮现:

  1. 创建城市列表
  2. 使用for循环迭代整个列表
  3. 使用toMap方法创建城市地图
  4. db.insert循环内调用方法

我不确定,但这似乎是愚蠢的方法,所以考虑更好和优化的解决方案......

Atl*_*dal 8

正如@chunhunghan 提到的,您可以使用批处理插入批量数据。

以下是分步指南:

  1. 准备好你的 json 文件,例如cities.json(创建 csv 数据文件并像这样使用 csv 到 json 转换器)
  2. cities.json在您的assets目录中添加文件
  3. pubspec.yaml像这样定义它:

    assets:
     - assets/cities.json
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    
    Run Code Online (Sandbox Code Playgroud)

就是这样!:)


chu*_*han 5

有 Batch 支持
为了避免 dart 和本机代码之间的乒乓球,您可以使用 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();
Run Code Online (Sandbox Code Playgroud)

官方示例https://github.com/tekartik/sqflite/blob/master/sqflite/example/lib/batch_test_page.dart

在您的情况下,对于带有batch.insert命令的循环列表,为了简化语法更容易维护
,使用toMap,例如

batch.insert("cities", city.toMap());   
Run Code Online (Sandbox Code Playgroud)

详细信息https://www.techiediaries.com/flutter-sqlite-crud-tutorial/

如果您更喜欢 rawInsert,请参考在 Sqflite 中插入多条记录