【Flutter 3-4】Flutter進階教程——數據持久化sqflite使用

做者 | 弗拉德
來源 | 弗拉德(公衆號:fulade_me)git

sqflite

數據持久化是在移動端開發中必不可少的技術手段。咱們老是有一些用戶信息,應用資源,列表數據等須要存儲起來,這裏咱們主要來說基於SQLite數據庫的數據儲存。
SQLite,是一款輕型的數據庫。它的設計目標是嵌入式的,並且已經在不少嵌入式產品中使用了它,它佔用資源很是的低,在嵌入式設備中,可能只須要幾百K的內存就夠了。更多詳細信息能夠參考:維基百科百度百科
Flutter已經幫助咱們封裝了操做SQLite的庫,它就是:sqflitegithub

集成sqflite庫

使用sqflite第三方庫須要咱們在pubspec.yaml文件先添加庫的名字和版本號
dependencies字段下添加:sql

sqflite: ^1.1.3

這裏以1.1.3爲例
添加完成後保存一下,VSCode默認會執行pub get幫咱們把須要的庫下載下來,一樣咱們也能夠在項目根目錄下執行pub get來手動拉取須要的庫。數據庫

1. 建立本地數據文件

static Future<SqfliteManager> _initDataBase() async {
SqfliteManager manager = SqfliteManager();
String dbPath = await getDatabasesPath() + "/$sqlName";
if (manager.db == null) {
    manager.db = await openDatabase(
    dbPath,
    version: 1,
    onCreate: (db, version) async {
        /// 若是不存在 當前的表 就建立須要的表
        if (await manager.isTableExit(db, tableName) == false) {
        await db.execute(CREATE_DATA_TABLE);
        }
    },
    );
}
return manager;
}

首先咱們經過getDatabasesPath()函數獲取到本地保存數據庫文件的路徑,在此路徑後面拼接上咱們的數據庫文件名字,就是保存數據庫文件的路徑。在iOS中該路徑在沙河路徑下的Documents文件夾內,在Android中時默認數據庫目錄。
以後咱們聲明一個Database對象,用來保存數據庫操做對象數組

Database db;

先判斷此對象是否存在,若是不存在咱們調用openDatabase來建立
這裏傳入前面獲取到的數據庫地址,版本號,和onCreate回調函數。
onCreate回調內部判斷是否存在咱們須要使用的表名字,若是不存就執行建立數據庫表的sql語句。app

除了 onCreate回調,還有 onUpgradeonDowngradeonOpen等回調。另一個參數 singleInstance它表示當傳入相同的數據庫路徑是否返回同一個的實例對象,默認是 true

2. 插入數據

鑑於sqflite幫咱們作了不少工做,因此在使用基本的也很簡單async

/// 插入數據
  Future<int> insertData(Map<String, dynamic> value) async {
    return await db.insert(tableName, value);
  }

只須要傳入表名字和要插入的數據就行
咱們再來看一下insert函數的其餘參數函數

Future<int> insert(String table, Map<String, dynamic> values,
      {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
  • nullColumnHack 是在傳入的插入數據是空的時候 起到做用的

若是插入數據爲空:
若不添加nullColumnHack則sql語句最終的結果將會相似insert into tableName()values(),這是不容許的。
若添加上nullColumnHack則sql語句將會變成insert into tableName (nullColumnHack)values(null),這是能夠的。spa

  • conflictAlgorithm 是一個枚舉,當插入的數據出現衝突或錯誤時,咱們該使用哪一種策略,有如下幾個值
enum ConflictAlgorithm {
  rollback,
  abort,
  fail,
  ignore,
  replace,
}

3. 刪除數據

刪除數據的代碼以下設計

/// 刪除一條數據
Future<int> deleteData(int id) async {
    return await db.delete(tableName, where: "id = ?", whereArgs: [id]);
}

來看一下詳細的delete函數都有哪些參數:

Future<int> delete(String table, {String where, List<dynamic> whereArgs});
  • table是要刪除數據所在的表的名字 例如:testTable
  • where是一個字符串,表示的是要刪除的表達語句 例如:"id = ?"
  • whereArgs是一個數組,是用來補充where語句裏面的?參數的 例如:[2]

當咱們傳入上面示例參數後,要標的意思就是:要刪除testTable 表內 id = 2 的數據

4. 更新數據

刪除數據代碼以下

Future<int> updateData(Map<String, dynamic> value, int id) async {
    return await db.update(
        tableName,
        value,
        where: "id = ?",
        whereArgs: [id],
    );
}

詳細的update函數以下

Future<int> update(String table, Map<String, dynamic> values,
      {String where,
      List<dynamic> whereArgs,
      ConflictAlgorithm conflictAlgorithm});

insert函數的參數基本一致,這裏就不贅述了

5. 查詢數據

直接來看查詢語句的參數

Future<List<Map<String, dynamic>>> query(
    String table,  /// 表名字 是必傳參數
    {bool distinct,  // 是否包含重複數據
    List<String> columns,  // 須要查詢的列
    String where,       //  查詢條件
    List<dynamic> whereArgs, // 查詢條件參數
    String groupBy,  //按列分組 列的名字
    String having,   // 給分組設置條件
    String orderBy,   // 按列排序 asc/desc
    int limit,     // 限制查詢結果數量
    int offset});  // 從第幾條開始查詢

查詢語句的參數比較豐富,基本能夠知足咱們一些複雜場景的查詢需求

好了,關於sqflite的使用就總結這些了。

想體驗以上的示例的運行效果,能夠到個人Github倉庫項目flutter_app->lib->routes->sqflite_page.dart查看,而且能夠下載下來運行並體驗。


公衆號

相關文章
相關標籤/搜索