上一篇博文介绍了Flutter 如何读取 excel 文件,这一篇我们来介绍如何操作数据库。
Flutter 提供了三种数据持久化方式:
- 将 KV 值存储到硬盘:shared_preferences
- 读取和写入文件:Read and write files
- 数据库:sqflite。
这篇要介绍的就是操作数据库的组件 sqflite
。
SQLite 是一个开源的嵌入式关系型数据库管理系统。它有以下几个主要特点:
-
嵌入式:SQLite 不是一个独立运行的进程,而是作为程序的一部分链接进可执行文件或动态链接库中运行。这使得它非常紧凑、高效,可以直接集成到应用程序中。
-
无服务器:SQLite 是一个无服务器的数据库引擎,它直接读写普通磁盘文件。这简化了配置,同时也无需管理数据库服务器进程。
-
零配置:SQLite 不需要复杂的配置,开箱即用。只要将数据文件放到指定位置即可使用。
-
跨平台:SQLite 使用 ANSI-C 编写,可在多个操作系统上运行,包括 Windows、Linux、Unix、MacOS 等。
-
事务支持:SQLite 支持 ACID 事务,能够保证数据的完整性和可靠性。
-
轻量级:SQLite 相比其他数据库引擎占用非常小的磁盘空间和内存资源。
-
单文件数据库:SQLite 将整个数据库(定义、表、索引和数据)存储到主机文件系统的单个文件中。
因此,SQLite 广泛应用于需要嵌入式数据持久化的场景,如手机应用、游戏、嵌入式设备等。它简单易用,体积小巧,成为许多应用的首选数据库解决方案。
接下来我们通过一个具体例子来演示下它的用法。
第一步:准备一个内容如下的 yaml 文件(文件名:atteno.yaml):
conjugations:
- N1 + あってのN2
examples:
- jp: お客様 **あっての** 仕事ですから、いつもご来店いただくお客様には感謝しております。zh: 有顾客才有的工作,所以感谢经常来光临的顾客。
- jp: 自分がこんなにも早く出世できたのも、厳しい上司の指導 **あっての** ことです。zh: 我之所以能够这么快地出人头地,是因为有老板严格的指导。
- jp: 愛 **あっての** 結婚生活でしょ。愛がないならどうして一緒に暮らしてるの?zh: 有爱才有婚姻生活。如果没有爱,为什么要生活在一起?
- jp: 健康 **あっての** 幸せ。zh: 有健康才有幸福。
explanations: []
level: N1
meanings:jp:- 〜があるから・・・が成り立つ- =〜がなかったら、・・・が成り立たないzh:- 有…才有
name: 〜あっての・・・
tags:
- 軽重の强调
这里我们可以使用 yaml 这个 package 来读取 yaml 文件。
第二步:定义与 yaml 文件内容相对应的数据结构(文件名:grammar_item_model.dart):
class GrammarItemModel {final int id;final String name;final String level;final String meaning;final String conjugation;final String explanation;final String example;
}
第三步:定义管理数据库操作的 helper 类。
class DatabaseHelper {// 数据库名称static const _dbName = "senluo.db";// 数据库版本号static const _dbVersion = 1;// 表名static final _tableGrammar = 'grammar';// 数据库实例static Database? _database;// 懒加载Future<Database> get database async {if (_database != null) return _database!;_database = await _initDatabase();return _database!;}// 数据库初始化_initDatabase() async {Directory documentsDirectory = await getApplicationDocumentsDirectory();String path = join(documentsDirectory.path, _dbName);return await openDatabase(path,version: _dbVersion,onCreate: _onCreate,);}// ...
}
这段代码提供了一个单例模式的数据库实例,确保在应用程序的整个生命周期中只有一个数据库连接。同时,它还提供了一种简单的方式来打开或创建 SQLite 数据库文件。
第四步:在 DatabaseHelper
中定义插入一条数据的方法。
class DataHelper {// ...// SQL code to create the database tableFuture _onCreate(Database db, int version) async {// the table [grammar]await db.execute('''CREATE TABLE $_tableGrammar (id INTEGER PRIMARY KEY, name TEXT,level TEXT,meaning TEXT,conjugation TEXT,explanation TEXT,example TEXT)''');}// ...
}
这段代码会在数据库中创建一个名为 grammar 的表,包含7列,可用于存储语法知识相关的数据。在应用启动时,如果检测到数据库不存在,就会执行这段代码创建新表。
第五步:调用 insertGrammarItem
插入数据。
Future<void> addItem(GrammarItem item) async {await DatabaseHelper().insertGrammarItem(GrammarItemModel(id: 0,name: item.name,level: item.level.name,meaning: jsonEncode(item.meaning),conjugation: item.conjugations.join('#'),explanation: item.explanations.join('#'),example: jsonEncode(item.examples),),);
}
以上就是创建数据库并插入数据的全过程,感谢阅读。