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包

相關文章
相關標籤/搜索