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 个城市,我想将它们插入表格中。
问:最好且最简单的方法是什么?
这在我脑海中浮现:
for循环迭代整个列表toMap方法创建城市地图db.insert循环内调用方法我不确定,但这似乎是愚蠢的方法,所以考虑更好和优化的解决方案......
正如@chunhunghan 提到的,您可以使用批处理插入批量数据。
以下是分步指南:
cities.json(创建 csv 数据文件并像这样使用 csv 到 json 转换器)cities.json在您的assets目录中添加文件pubspec.yaml像这样定义它:
assets:
- assets/cities.json
Run Code Online (Sandbox Code Playgroud)将此代码粘贴到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)就是这样!:)
有 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 中插入多条记录