Flutter:在数据库中插入数据列表的有效方法
Flutter: Effective way of inserting list of data in database
我有 cities
table 并尝试在创建数据库时插入城市。 table 结构非常简单,它只有 id
和 name
列。
在我的数据库 class 的 onCreate
方法中,我使用以下命令创建 table:
var tblCities = 'cities';
await db.execute('CREATE TABLE $tblCities (id INTEGER PRIMARY KEY, name TEXT)');
我有 Cities
模型 class 和 fromMap
和 toMap
方法。
大约有 350 个城市,我想将它们插入 table。
问。最好和最简单的方法是什么?
我想到了这个:
- 正在创建城市列表
- 使用
for
循环遍历整个列表
- 使用
toMap
方法创建城市地图
- 在循环中调用
db.insert
方法
我不确定,但这看起来很愚蠢,所以考虑更好和优化的解决方案...
您可以编写一个原始查询,将所有数据一次性插入到数据库中。
有批量支持
为了避免飞镖和本机代码之间的乒乓球,你可以使用 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());
详情https://www.techiediaries.com/flutter-sqlite-crud-tutorial/
如果您更喜欢rawInsert,请参考Insert multiple records in Sqflite
正如@chunhunghan 所提到的,您可以使用批处理来插入批量数据。
以下是分步指南:
- 准备好您的 json 文件,例如
cities.json
(创建数据的 csv 文件并使用 csv 到 json 转换器,如 this)
- 在您的
assets
目录中添加 cities.json
文件
在pubspec.yaml
中这样定义它:
assets:
- assets/cities.json
将此代码粘贴到数据库 class 的 onCreate
方法中(确保其在 table 创建查询之后)
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();
就是这样! :)
我有 cities
table 并尝试在创建数据库时插入城市。 table 结构非常简单,它只有 id
和 name
列。
在我的数据库 class 的 onCreate
方法中,我使用以下命令创建 table:
var tblCities = 'cities';
await db.execute('CREATE TABLE $tblCities (id INTEGER PRIMARY KEY, name TEXT)');
我有 Cities
模型 class 和 fromMap
和 toMap
方法。
大约有 350 个城市,我想将它们插入 table。
问。最好和最简单的方法是什么?
我想到了这个:
- 正在创建城市列表
- 使用
for
循环遍历整个列表 - 使用
toMap
方法创建城市地图 - 在循环中调用
db.insert
方法
我不确定,但这看起来很愚蠢,所以考虑更好和优化的解决方案...
您可以编写一个原始查询,将所有数据一次性插入到数据库中。
有批量支持
为了避免飞镖和本机代码之间的乒乓球,你可以使用 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());
详情https://www.techiediaries.com/flutter-sqlite-crud-tutorial/
如果您更喜欢rawInsert,请参考Insert multiple records in Sqflite
正如@chunhunghan 所提到的,您可以使用批处理来插入批量数据。
以下是分步指南:
- 准备好您的 json 文件,例如
cities.json
(创建数据的 csv 文件并使用 csv 到 json 转换器,如 this) - 在您的
assets
目录中添加cities.json
文件 在
pubspec.yaml
中这样定义它:assets: - assets/cities.json
将此代码粘贴到数据库 class 的
onCreate
方法中(确保其在 table 创建查询之后)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();
就是这样! :)