您能在这里看到啥
- 运行效果
- 数据库准备
- 数据库创建
- 创建遇到的问题
- DEMO地址
运行效果
数据库准备
首先,我们先把需要使用的第三方库准备一下,这样也会加快我们的开发节奏.👇
第三方
# 本地数据库
sqflite: ^2.0.2+1
# 提供了大量方法,以便你能正确的定义数据库在磁盘上的存储位置
path: ^1.8.0
# 自己写的方便项目开发的插件
hzy_normal_widget: ^0.0.4
# 加载动画
flutter_easyloading: ^3.0.5
数据库创建
- 创建数据库
/// 通过sqflite 提供的方法,可以直接获取到,数据库存储的路径
String databasePath = await getDatabasesPath();
/// 再通过path提供的方法,直接生成数据库的原始路径
String path = join(databasePath, SqlConfig.dbname);
try {
/// 数据库创建完成
db = await openDatabase(path);
} catch (e) {
/// 走这里的话,说明数据创建失败,你需要排查一下,是不是路径问题
debugprint('CreateTables init Error $e');
}
-
创建表
对于创建表,这里就需要你,根据业务需求,去自己创建了,我这边就简单的举个例子,说明一下怎么创建表.第一步:定义数据表字段类型
- 我一般会先创建业务模型,从我们👆运行效果中,可以看到,UI表现层,有时间,发布内容,
这样的话,我们业务模型就可以设计如下所示
class ListModel { ListModel({ this.listid, /// 列表ID this.title, /// 发布内容 this.createtime, /// 创建时间 this.updatetime, /// 更新时间 }) }
当然这只是最基础的业务模型,不要误会了.
-
根据数据模型创建数据表,当然数据表肯定是包含模型的.
从上面的基础模型中,我们来创建表.这四个参数肯定是要有的,然后就是这个文章的归宿,肯定也是需要用户ID,因为文章也得有归宿啊.好,说干就干,那我们来一个最简单的内容数据表吧
static final String createListTable = ''' CREATE TABLE IF NOT EXISTS tableName ( listid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, uid BIGINT(20), title TEXT, createtime BIGINT(20), updatetime BIGINT(20) ) '''
👆,已经是我们创建表的基础语法,这里我简单说一下,上面的大写字段 代表的意识
// 创建表的语句,意思是如果表不存在就去创建 CREATE TABLE IF NOT EXISTS tablename // 主键 递增 INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE // 代表字符串 TEXT // int 类型 最大多少位 BIGINT // 用这个修饰的字段不能为null, NOT NULL
当然还有很多,需要的时候,自己查查资料就行,不是很难.
也是为了方便,我一般都不会把这种字符串,进行定义,这样修改起来也方便,当然也会减少手写的出错率.class SqlConfig { /// 数据库名字 static String dbname = "hzysql.db"; /// 数据库表版本 static int dbversion = 1; /// 创建表通用语句 static String creattable = 'CREATE TABLE IF NOT EXISTS'; /// 主键 递增 static String primarykeyauto = 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE'; /// 不为null static String sqlnonull = 'NOT NULL'; /// text static String sqltext = 'TEXT'; /// 列表数据表名字 static String list = 'list'; }
这样👆创建数据表的方式就如👇所示
class NormalCreateTables { static final String createListTable = ''' ${SqlConfig.creattable} ${SqlConfig.list} ( ${ListModelId.listid} ${SqlConfig.primarykeyauto}, ${ListModelId.uid} BIGINT(20), ${ListModelId.name} ${SqlConfig.sqltext}, ${ListModelId.title} ${SqlConfig.sqltext}, ${ListModelId.createtime} BIGINT(20), ${ListModelId.updatetime} BIGINT(20) ) '''; /// 获取所有的表 Map<String, String> getAllTables() { Map<String, String> map = <String, String>{}; map['list'] = createListTable; return map; } }
好了,有了定义好的表,那我们就看一下怎么在数据里进行创建吧
第二步:创建表
- 获取需要生成表的sql语句
//所有的sql语句 Map<String, String> allTableSqls = NormalCreateTables().getAllTables();
- 检查数据库中是否有所有有表,返回需要创建的表
// 检查数据库中是否有所有有表,返回需要创建的表 Future<List<String>> getNoCreateTables(Map<String, String> tableSqls) async { Iterable<String> tableNames = tableSqls.keys; //已经存在的表 List<String> existingTables = []; //要创建的表 List<String> createTables = []; /// 获取数据库中已经存在的表 List tableMaps = await db! .rawQuery('SELECT name FROM sqlite_master WHERE type = "table"'); debugprint('tableMaps:' + tableMaps.toString()); for (var item in tableMaps) { existingTables.add(item['name']); } for (var tableName in tableNames) { if (!existingTables.contains(tableName)) { createTables.add(tableName); } } return createTables; }
- 创建需要创建的表
//检查需要生成的表 List<String> noCreateTables = await getNoCreateTables(allTableSqls); debugprint('noCreateTables:' + noCreateTables.toString()); /// 如果有需要创建的表 if (noCreateTables.isNotEmpty) { // 关闭上面打开的db,否则无法执行open db!.close(); /// 打开数据库 db = await openDatabase(path, version: 1, onCreate: (Database db, int version) async { debugprint('db created version is $version'); }, onOpen: (Database db) async { /// 创建新表 for (var sql in noCreateTables) { await db.execute(allTableSqls[sql]!); } debugprint('db补完表已打开'); }); } else { debugprint("表都存在,db已打开"); } List tableMaps = await db!.rawQuery('SELECT name FROM sqlite_master WHERE type = "table"'); debugprint('所有表:' + tableMaps.toString()); db!.close(); debugprint("db已关闭");
至此,我们前期需要创建的表,到此就创建完成.
- 我一般会先创建业务模型,从我们👆运行效果中,可以看到,UI表现层,有时间,发布内容,
创建遇到的问题
在第一次创建表的时候,由于没太注意语法,导致了👇的问题
根据👆报错的提示,准确的找到了发生问题地方,如👇
相信很多同学都已经找到问题了,对就是
就是最后这个多余的 ,
其实从👆报错提示也说的很清楚.
至此,创建数据库已经完成,下一篇文章我会详细的讲解,
增,删,改,查,当然删除数据库我是不会讲的,大家有兴趣,可以自己🧐.