做者 | 弗拉德
來源 | 弗拉德(公衆號:fulade_me)git
數據持久化是在移動端開發中必不可少的技術手段。咱們老是有一些用戶信息,應用資源,列表數據等須要存儲起來,這裏咱們主要來說基於SQLite數據庫的數據儲存。
SQLite,是一款輕型的數據庫。它的設計目標是嵌入式的,並且已經在不少嵌入式產品中使用了它,它佔用資源很是的低,在嵌入式設備中,可能只須要幾百K的內存就夠了。更多詳細信息能夠參考:維基百科、百度百科。
Flutter已經幫助咱們封裝了操做SQLite的庫,它就是:sqflitegithub
使用sqflite
第三方庫須要咱們在pubspec.yaml
文件先添加庫的名字和版本號
在dependencies
字段下添加:sql
sqflite: ^1.1.3
這裏以1.1.3
爲例
添加完成後保存一下,VSCode默認會執行pub get
幫咱們把須要的庫下載下來,一樣咱們也能夠在項目根目錄下執行pub get
來手動拉取須要的庫。數據庫
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
回調,還有onUpgrade
、onDowngrade
、onOpen
等回調。另一個參數singleInstance
它表示當傳入相同的數據庫路徑是否返回同一個的實例對象,默認是true
鑑於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則sql語句最終的結果將會相似insert into tableName()values(),這是不容許的。
若添加上nullColumnHack則sql語句將會變成insert into tableName (nullColumnHack)values(null),這是能夠的。spa
enum ConflictAlgorithm { rollback, abort, fail, ignore, replace, }
刪除數據的代碼以下設計
/// 刪除一條數據 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
是要刪除數據所在的表的名字 例如:testTablewhere
是一個字符串,表示的是要刪除的表達語句 例如:"id = ?"whereArgs
是一個數組,是用來補充where
語句裏面的?
參數的 例如:[2]當咱們傳入上面示例參數後,要標的意思就是:要刪除testTable 表內 id = 2 的數據
刪除數據代碼以下
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
函數的參數基本一致,這裏就不贅述了
直接來看查詢語句的參數
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
查看,而且能夠下載下來運行並體驗。