You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:20:53