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

开始

使用sqflite操做sqlitehtml

sqflite: ^1.1.7+1
复制代码

能够先看官方sqlite教程,我以为写的还不错, 比其余中文版的文章教程好多了(压根看不下去)。(除了我这篇)sql

官方sqlite教程数据库

初始化db

使用openDatabase初始化bash

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})async

初始化以前须要先打开数据库ide

一、打开数据库

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

2. 新建表

默认开始是没有表的,若是直接新建表那么须要本身搞一个表那么须要判断表是否存在。学习

可是sqflite有onCreate钩子,首次建立数据库时,就会执行。ui

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才会执行。spa

代码

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使用操做数据库3d

操做数据库

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

sqflite里面有一个DatabaseExecutor抽象类,我把全部的操做列出来

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

原生操做表(raw)

方法

execute
rawInsert
rawDelete
rawUpdate
rawQuery
复制代码

直接写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包

相关文章
相关标签/搜索