flutter-数据库

您能在这里看到啥

  1. 运行效果
  2. 数据库准备
  3. 数据库创建
  4. 创建遇到的问题
  5. DEMO地址

运行效果

sql_over_g.gif

数据库准备

首先,我们先把需要使用的第三方库准备一下,这样也会加快我们的开发节奏.

第三方

# 本地数据库
sqflite: ^2.0.2+1
# 提供了大量方法,以便你能正确的定义数据库在磁盘上的存储位置
path: ^1.8.0
# 自己写的方便项目开发的插件
hzy_normal_widget: ^0.0.4
# 加载动画
flutter_easyloading: ^3.0.5

数据库创建

  1. 创建数据库
/// 通过sqflite 提供的方法,可以直接获取到,数据库存储的路径
String databasePath = await getDatabasesPath();
/// 再通过path提供的方法,直接生成数据库的原始路径
String path = join(databasePath, SqlConfig.dbname);
try {
    /// 数据库创建完成
    db = await openDatabase(path);
} catch (e) {
    /// 走这里的话,说明数据创建失败,你需要排查一下,是不是路径问题
    debugprint('CreateTables init Error $e');
}
  1. 创建表
    对于创建表,这里就需要你,根据业务需求,去自己创建了,我这边就简单的举个例子,说明一下怎么创建表.

    第一步:定义数据表字段类型
    1. 我一般会先创建业务模型,从我们运行效果中,可以看到,UI表现层,有时间,发布内容,
      这样的话,我们业务模型就可以设计如下所示
    class ListModel {
       ListModel({
           this.listid, /// 列表ID
           this.title, /// 发布内容
           this.createtime, /// 创建时间
           this.updatetime, /// 更新时间
       })
    }
    

    当然这只是最基础的业务模型,不要误会了.

    1. 根据数据模型创建数据表,当然数据表肯定是包含模型的.

      从上面的基础模型中,我们来创建表.这四个参数肯定是要有的,然后就是这个文章的归宿,肯定也是需要用户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 getAllTables() {
           Map map = {};
           map['list'] = createListTable;
           return map;
       }
    }
    

    好了,有了定义好的表,那我们就看一下怎么在数据里进行创建吧

    第二步:创建表
    1. 获取需要生成表的sql语句
     //所有的sql语句
     Map allTableSqls = NormalCreateTables().getAllTables();
    
    
    1. 检查数据库中是否有所有有表,返回需要创建的表
    // 检查数据库中是否有所有有表,返回需要创建的表
     Future> getNoCreateTables(Map tableSqls) async {
         Iterable tableNames = tableSqls.keys;
         //已经存在的表
         List existingTables = [];
         //要创建的表
         List 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;
     }
    
    1. 创建需要创建的表
    //检查需要生成的表
     List 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已关闭");
    

    至此,我们前期需要创建的表,到此就创建完成.

创建遇到的问题

在第一次创建表的时候,由于没太注意语法,导致了的问题

截屏2022-08-15 14.44.49.png

根据报错的提示,准确的找到了发生问题地方,如

截屏2022-08-15 14.45.08.png

相信很多同学都已经找到问题了,对就是
就是最后这个多余的 ,
其实从报错提示也说的很清楚.

至此,创建数据库已经完成,下一篇文章我会详细的讲解,
,,,,当然删除数据库我是不会讲的,大家有兴趣,可以自己.


DEMO地址
flutter-数据库老相识之增、删、改、查


你可能感兴趣的:(flutter-数据库)