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<String, String> getAllTables() {
           Map<String, String> map = <String, String>{};
           map['list'] = createListTable;
           return map;
       }
    }
    

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

    第二步:创建表
    1. 获取需要生成表的sql语句
     //所有的sql语句
     Map<String, String> allTableSqls = NormalCreateTables().getAllTables();
    
    
    1. 检查数据库中是否有所有有表,返回需要创建的表
    // 检查数据库中是否有所有有表,返回需要创建的表
     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;
     }
    
    1. 创建需要创建的表
    //检查需要生成的表
     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已关闭");
    

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

创建遇到的问题

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

截屏2022-08-15 14.44.49.png

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

截屏2022-08-15 14.45.08.png

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

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


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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 我们平时开发android或者ios都有比较成熟的高级数据库管理,但是目前flutter暂时没有,所以我们目前数据...
    节庆007阅读 11,819评论 6 9
  • 基础查询 select 查询列表 from 表名; USE myemployees; //最好写上 1.查询表中的...
    暧莓悠阅读 571评论 0 1
  • 1、数据库介绍篇 1.1什么是数据库 数据库:保存数据的仓库。它体现我们电脑中,就是一个文件系统。然后把数据都保存...
    投石机阅读 700评论 0 0
  • 数据库的作用: 在Android开发中,数据库在小中型的app中使用并不广泛,但对于数据管理的方便性是其他数据存储...
    佼佼者Mr阅读 693评论 1 1
  • (一)Oracle数据库 1.oracle中row_id理解 ORACLE的row_id是一个伪列,其个是为18个...
    独云阅读 5,583评论 0 10