您好,登錄后才能下訂單哦!
前言
數據庫存儲是我們常用的存儲方式之一,對大批量數據有增、刪、改、查操作需求時,我們就會想到使用數據庫,Flutter中提供了一個sqflite插件供我們用于大量數據執行CRUD操作。本篇我們就來一起學習sqflite的使用。
sqflite是一款輕量級的關系型數據庫,類似SQLite。
在Flutter平臺我們使用sqflite庫來同時支持Android 和iOS。
sqflite使用
引入插件
在pubspec.yaml文件中添加path_provider插件,最新版本為1.0.0,如下:
dependencies: flutter: sdk: flutter #sqflite插件 sqflite: 1.0.0
然后命令行執行flutter packages get即可將插件下載到本地。
數據庫操作方法介紹
1. 插入操作
插入數據操作有兩個方法:
Future<int> rawInsert(String sql, [List<dynamic> arguments]); Future<int> insert(String table, Map<String, dynamic> values, {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
rawInsert方法第一個參數為一條插入sql語句,可以使用?作為占位符,通過第二個參數填充數據。
insert方法第一個參數為操作的表名,第二個參數map中是想要添加的字段名和對應字段值。
2. 查詢操作
查詢操作同樣實現了兩個方法:
Future<List<Map<String, dynamic>>> query(String table, {bool distinct, List<String> columns, String where, List<dynamic> whereArgs, String groupBy, String having, String orderBy, int limit, int offset}); Future<List<Map<String, dynamic>>> rawQuery(String sql, [List<dynamic> arguments]);
query方法第一個參數為操作的表名,后邊的可選參數依次表示是否去重、查詢字段、WHERE子句(可使用?作為占位符)、WHERE子句占位符參數值、GROUP BY子句、HAVING子句、ORDER BY子句、查詢的條數、查詢的偏移位等。
rawQuery方法第一個參數為一條查詢sql語句,可以使用?作為占位符,通過第二個參數填充數據。
3. 修改操作
修改操作同樣實現了兩個方法:
Future<int> rawUpdate(String sql, [List<dynamic> arguments]); Future<int> update(String table, Map<String, dynamic> values, {String where, List<dynamic> whereArgs, ConflictAlgorithm conflictAlgorithm});
rawUpdate方法第一個參數為一條更新sql語句,可以使用?作為占位符,通過第二個參數填充數據。
update方法第一個參數為操作的表名,第二個參數為修改的字段和對應值,后邊的可選參數依次表示WHERE子句(可使用?作為占位符)、WHERE子句占位符參數值、發生沖突時的操作算法(包括回滾、終止、忽略等等)。
4. 刪除操作
修改操作同樣實現了兩個方法:
Future<int> rawDelete(String sql, [List<dynamic> arguments]); Future<int> delete(String table, {String where, List<dynamic> whereArgs});
rawDelete方法第一個參數為一條刪除sql語句,可以使用?作為占位符,通過第二個參數填充數據。
delete方法第一個參數為操作的表名,后邊的可選參數依次表示WHERE子句(可使用?作為占位符)、WHERE子句占位符參數值。
舉個栗子
我們以圖書管理系統來舉例。
首先,我們創建一個書籍類,包括書籍ID、書名、作者、價格、出版社等信息。
final String tableBook = 'book'; final String columnId = '_id'; final String columnName = 'name'; final String columnAuthor = 'author'; final String columnPrice = 'price'; final String columnPublishingHouse = 'publishingHouse'; class Book { int id; String name; String author; double price; String publishingHouse; Map<String, dynamic> toMap() { var map = <String, dynamic>{ columnName: name, columnAuthor: author, columnPrice: price, columnPublishingHouse: publishingHouse }; if (id != null) { map[columnId] = id; } return map; } Book(); Book.fromMap(Map<String, dynamic> map) { id = map[columnId]; name = map[columnName]; author = map[columnAuthor]; price = map[columnPrice]; publishingHouse = map[columnPublishingHouse]; } }
其次,我們開始實現數據庫相關操作:
1. 創建數據庫文件和對應的表
// 獲取數據庫文件的存儲路徑 var databasesPath = await getDatabasesPath(); String path = join(databasesPath, 'demo.db'); //根據數據庫文件路徑和數據庫版本號創建數據庫表 db = await openDatabase(path, version: 1, onCreate: (Database db, int version) async { await db.execute(''' CREATE TABLE $tableBook ( $columnId INTEGER PRIMARY KEY, $columnName TEXT, $columnAuthor TEXT, $columnPrice REAL, $columnPublishingHouse TEXT) '''); });
2. CRUD操作實現
// 插入一條書籍數據 Future<Book> insert(Book book) async { book.id = await db.insert(tableBook, book.toMap()); return book; } // 查找所有書籍信息 Future<List<Book>> queryAll() async { List<Map> maps = await db.query(tableBook, columns: [ columnId, columnName, columnAuthor, columnPrice, columnPublishingHouse ]); if (maps == null || maps.length == 0) { return null; } List<Book> books = []; for (int i = 0; i < maps.length; i++) { books.add(Book.fromMap(maps[i])); } return books; } // 根據ID查找書籍信息 Future<Book> getBook(int id) async { List<Map> maps = await db.query(tableBook, columns: [ columnId, columnName, columnAuthor, columnPrice, columnPublishingHouse ], where: '$columnId = ?', whereArgs: [id]); if (maps.length > 0) { return Book.fromMap(maps.first); } return null; } // 根據ID刪除書籍信息 Future<int> delete(int id) async { return await db.delete(tableBook, where: '$columnId = ?', whereArgs: [id]); } // 更新書籍信息 Future<int> update(Book book) async { return await db.update(tableBook, book.toMap(), where: '$columnId = ?', whereArgs: [book.id]); }
3. 關閉數據庫
數據庫對象使用完之后要在適當的時候關閉掉,可在helper類中實現以下方法。
Future close() async => db.close();
事務
sqflite同時支持事務,通過事務可以將多條原子操作放在一起執行,保證操作要么全部執行完成,要么都不執行。
比如有兩條書籍數據必須全部插入書庫中才算添加成功,則使用如下方法
Future<bool> insertTwoBook(Book book1, Book book2) async { return await db.transaction((Transaction txn) async { book1.id = await db.insert(tableBook, book1.toMap()); book2.id = await db.insert(tableBook, book2.toMap()); print('book1.id = ${book1.id}, book2.id = ${book2.id}'); return book1.id != null && book2.id != null; }); }
寫在最后
以上介紹了sqflite中我們常用的幾個操作,有了sqflite我們就可以開發更豐富的應用程序,在開發實踐中大家遇到任何問題都可以給我們發消息反饋,大家一起交流探討共同進步。針對一些用戶的反饋我們將在下一篇介紹Flutter的代碼調試。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。