如何在App初始化时自动将Assets中JSON数据导入sqflite表
实现Assets中JSON数据自动导入sqflite并添加指定字段
完全可行,以下是具体实现步骤:
1. 配置Assets路径
确保在pubspec.yaml中声明JSON文件的Assets路径,让Flutter能够读取到:
flutter: assets: - assets/words.json
2. 读取并处理JSON数据
通过rootBundle读取Assets中的JSON文件,同时为每条数据添加inFavorite字段(建议用布尔类型,sqflite会自动映射为整数存储):
import 'package:flutter/services.dart' show rootBundle; import 'dart:convert'; Future<List<Map<String, dynamic>>> loadAndProcessJson() async { // 读取JSON文件内容 final String jsonContent = await rootBundle.loadString('assets/words.json'); final List<dynamic> rawData = json.decode(jsonContent); // 为每条数据添加inFavorite字段 return rawData.map((item) { return { ...item, 'inFavorite': false, }; }).toList(); }
3. 初始化sqflite数据库
创建对应的表结构,注意inFavorite字段用整数类型存储(sqflite中布尔值会被转为0/false、1/true):
import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart'; Future<Database> initDb() async { final String dbDir = await getDatabasesPath(); final String dbPath = join(dbDir, 'words_database.db'); return openDatabase( dbPath, version: 1, onCreate: (Database db, int version) async { await db.execute(''' CREATE TABLE words ( id INTEGER PRIMARY KEY AUTOINCREMENT, word TEXT NOT NULL UNIQUE, value TEXT NOT NULL, inFavorite INTEGER NOT NULL DEFAULT 0 ) '''); }, ); }
4. 批量插入数据到数据库
在App首次启动时执行导入操作,避免重复插入:
import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final Database db = await initDb(); // 检查数据库是否已有数据 final int? dataCount = Sqflite.firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM words') ); if (dataCount == 0) { final List<Map<String, dynamic>> processedData = await loadAndProcessJson(); // 用事务批量插入,提升效率 await db.transaction((txn) async { for (var item in processedData) { await txn.insert('words', item); } }); } runApp(const MyApp()); }
注意事项
word字段添加UNIQUE约束可以避免重复导入相同数据- 事务批量插入比单条插入效率更高,适合数据量较大的场景
- 若后续需要更新JSON数据,可以增加数据库版本号,在
onUpgrade方法中处理数据更新逻辑
内容的提问来源于stack exchange,提问作者Baysangur
相关产品推荐
相关产品推荐

