likes
comments
collection
share

flutter - sqlite数据库小白入门,看不懂打死我

作者站长头像
站长
· 阅读数 31

开始

使用sqflite操作sqlite

sqflite: ^1.1.7+1

可以先看官方sqlite教程,我觉得写的还不错, 比其他中文版的文章教程好多了(压根看不下去)。(除了我这篇)

官方sqlite教程

初始化db

使用openDatabase初始化

openDatabase语法 Future<Database> openDatabase(String path, {int version, FutureOr<void> Function(Database) onConfigure, FutureOr<void> Function(Database, int) onCreate, FutureOr<void> Function(Database, int, int) onUpgrade, FutureOr<void> Function(Database, int, int) onDowngrade, FutureOr<void> Function(Database) onOpen, bool readOnly = false, bool singleInstance = true})

初始化之前需要先打开数据库

1、打开数据库

penDatabase(
    join(await getDatabasesPath(), '<数据库名称>.db'),
)

2. 新建表

默认开始是没有表的,如果直接新建表那么需要自己搞一个表那么需要判断表是否存在。

但是sqflite有onCreate钩子,首次创建数据库时,就会执行。

openDatabase(
    join(await getDatabasesPath(), '<数据库名称>.db'),
    onCreate: (Database db, int version) async{
        // 新建表
        db.execute(sql语法);
    },
);

3. 添加版本

openDatabase(
    join(await getDatabasesPath(), '<数据库名称>.db'),
    onCreate: (Database db, int version) async{
        // 新建表
        db.execute(sql语法);
    },
    // 版本
    version: 1,
);

版本的作用是,当版本修改之后onCreate才会执行。

代码

import 'dart:io';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

String createSql = '''
  CREATE TABLE <表名称> (
    id       INTEGER,
    name     STRING,
);
''';
Database db = await openDatabase(
    join(await getDatabasesPath(), '<数据库名称>.db'),
    onCreate: (Database db, int version) async{
        // 新建表
        db.execute(createSql);
    },
    version: 1,
);

这样就可以拿db使用操作数据库

操作数据库

原生操作(以raw开头),和更适合flutter的操作(适不适合不知道,但是是为了它打造的)

sqflite里面有一个DatabaseExecutor抽象类,我把所有的操作列出来

// 这部分是原生操作表(raw)
execute
rawInsert
rawDelete
rawUpdate
rawQuery
// 这部分是dart操作表方法
insert
query
update
delete

原生操作表(raw)

方法

execute
rawInsert
rawDelete
rawUpdate
rawQuery

flutter - sqlite数据库小白入门,看不懂打死我 直接写sqlite语句,第二个可选参数是数据 第二个的数据是代入到sql语句里面,sql里面的?

例子

rawInsert(
      'INSERT INTO Test(name) VALUES(?)',
      ['name']
)

rawInsert、 rawDelete、 rawUpdate、 rawQuery

分别对应增删改查,那么新建表,统计数据等等操作怎么办?

使用execute。(仔细看你会发现这货返回值是void,不必慌张,这是正常的)

sqlite语法

如果你不会db语法,没事,百度或者谷歌学习下。

点击进入 菜鸟教程的sqlite语法

dart操作表

方法

insert
query
update
delete

例子

1. 添加

insert(
      '<表名>',
      {
          "<字段名称>": '<值>'
      },
      conflictAlgorithm: ConflictAlgorithm.replace,
);

2.查询

  • 1.1
db.query('<表名>')
  • 1.2
db.query('<表名>', columns: ['字段1', '字段2'], where: '"字段名称" = ?', whereArgs: [字段值]);

可选参数

{ 
      bool distinct,
      List<String> columns,
      String where,
      List<dynamic> whereArgs,
      String groupBy,
      String having,
      String orderBy,
      int limit,
      int offset
}

3.更变

update(
      '<表名>',
      // 条件
      where: "id = ?",
      // 值
      whereArgs: [id],
);

4.删除

delete(
      '<表名>',
      // 条件
      where: "id = ?",
      // 值
      whereArgs: [id],
);

事务

await database.transaction((db) async {
    await db.操作1
    await db.操作2
    // 只能使用内部的db参数操作
})

批量操作

batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
等等
results = await batch.commit();

如果执行的全部是execute,或者不需要知道执行的结果, 那么commit可以加一个 noResult: true

await batch.commit(noResult: true);

批量操作也有事务的味道,有一个失败,那么相当于从未执行过那几个操作。不过也提供了一个作死的操作,可以忽略失败的,其他的操作结果保留,不会回滚。

commit(continueOnError: true);

碎碎念:(个人觉得批量操作不应该放到事务里面)

关闭

关闭也很重要,记得释放魔法,不然手机可能顶不住。

这个可不分原生和dart语法了,我们已经脱离操作表的领域啦

await database.close();

可以把关闭写到dispose钩子里

  @override
  void dispose(){
    database.close();
    super.dispose();
  }

如果多个界面使用,不需要关闭(应用关闭会自动释放)

字段不支持的类型

DateTime bool 请不要使用上面两种类型

相关链接

sqflite包

转载自:https://juejin.cn/post/6844903996923052040
评论
请登录