亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Flutter持久化存儲之數據庫存儲(sqflite)詳解

2019-10-21 21:19:24
字體:
來源:轉載
供稿:網友

前言

數據庫存儲是我們常用的存儲方式之一,對大批量數據有增、刪、改、查操作需求時,我們就會想到使用數據庫,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的代碼調試。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91高潮在线观看| 日韩av在线播放资源| 久久在线观看视频| 精品视频在线播放| 亚洲香蕉av在线一区二区三区| 色偷偷综合社区| 日韩视频免费观看| 精品人伦一区二区三区蜜桃网站| 在线成人中文字幕| 亚洲精品91美女久久久久久久| 欧美有码在线观看| 国产精品激情av电影在线观看| 亚洲欧美在线免费观看| 97国产在线视频| 久久成人综合视频| 亚洲bt欧美bt日本bt| 亚洲综合在线做性| 欧美亚洲激情在线| 欧美性黄网官网| 久久久久久av| 日韩欧美在线视频观看| 97久久精品国产| 日韩精品小视频| 91av在线播放视频| 成人福利网站在线观看11| 精品久久久久久中文字幕| 日韩国产精品一区| 成人激情免费在线| 亚洲国产免费av| 亚洲精品视频久久| 日韩精品在线免费播放| 97婷婷大伊香蕉精品视频| 欧美在线视频一区| 午夜精品久久久久久久99热浪潮| 亚洲黄在线观看| 91免费视频网站| 91精品国产自产在线老师啪| 一色桃子一区二区| 久久精品中文字幕一区| 亚洲福利影片在线| 亚洲性xxxx| 欧美贵妇videos办公室| 91精品久久久久久久久久久久久久| 日韩中文字幕在线视频| 国产欧美久久久久久| 欧美一级视频在线观看| 亚洲免费视频观看| 欧美精品18videos性欧| 亚洲变态欧美另类捆绑| 欧美一区二三区| 在线亚洲午夜片av大片| 欧美贵妇videos办公室| 久久精品国产成人精品| 国自产精品手机在线观看视频| 久久伊人91精品综合网站| 国产成人精品视频| 日韩美女免费线视频| 裸体女人亚洲精品一区| 91精品国产一区| 国产精品久久久久高潮| 欧美精品久久一区二区| 欧美激情亚洲激情| 亚洲free性xxxx护士白浆| 日本aⅴ大伊香蕉精品视频| 欧美激情亚洲自拍| 中文字幕亚洲欧美在线| 国产精品久久久av久久久| 亚洲综合最新在线| 91精品视频在线看| 欧美日韩国产中文字幕| 成人黄色在线播放| 97香蕉久久夜色精品国产| www日韩中文字幕在线看| 精品一区精品二区| 国产精品亚洲аv天堂网| 国产精品99蜜臀久久不卡二区| 久久精品国产欧美激情| 精品美女久久久久久免费| 精品视频在线播放| 精品偷拍一区二区三区在线看| 中文字幕日韩欧美在线| 欧美在线亚洲在线| 成人免费大片黄在线播放| 成人网在线免费看| 国产这里只有精品| 日韩在线不卡视频| 久久免费视频观看| 久久久久久久亚洲精品| 久久精品男人天堂| 久久精品久久久久电影| 欧美视频在线免费看| 欧美一乱一性一交一视频| 亚洲第一区在线| 亚洲欧美中文字幕在线一区| 欧美视频13p| 亚洲色图在线观看| 一区二区三区精品99久久| 成人欧美一区二区三区在线| 国产亚洲人成a一在线v站| 欧美激情精品久久久久久黑人| 欧美亚洲视频在线看网址| 日韩欧美极品在线观看| 欧美成人剧情片在线观看| 91在线高清视频| 色综合久久久888| 亚洲精品电影在线| 亚洲自拍偷拍色片视频| 亚洲xxx视频| 久久久日本电影| 亚洲人成网站999久久久综合| 精品二区三区线观看| 国产欧美日韩专区发布| 欧美一区二区.| 亚洲欧美福利视频| 亚洲人线精品午夜| 色综合导航网站| 亚洲乱码一区av黑人高潮| 欧美在线www| 日韩一区二区久久久| 欧美中文在线视频| 欧美老妇交乱视频| 欧美日韩一区二区免费在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 日韩精品欧美国产精品忘忧草| 91成人性视频| 91情侣偷在线精品国产| 成人免费淫片aa视频免费| 亚洲色图激情小说| 精品国产拍在线观看| 欧美午夜女人视频在线| 亚洲乱码一区av黑人高潮| 精品一区电影国产| 91亚洲精品久久久久久久久久久久| 中文字幕日韩欧美在线视频| 欧美一级淫片播放口| 欧美整片在线观看| 欧美激情亚洲另类| 日韩高清电影免费观看完整| 久久久国产影院| 国产99久久精品一区二区| 日韩成人av网| 国产脚交av在线一区二区| 亚洲欧洲在线视频| 欧美性生交xxxxx久久久| 欧美肥臀大乳一区二区免费视频| 91在线观看免费网站| 久久福利视频网| 国产精品xxx视频| 久久99精品久久久久久噜噜| 亚洲欧美另类在线观看| 日韩精品亚洲精品| 日韩中文在线中文网在线观看| 国产精品久久久久7777婷婷| 精品毛片网大全| 日韩欧美亚洲综合| 一本色道久久综合亚洲精品小说| 日韩欧美第一页| 日韩免费在线观看视频| 日韩中文字幕在线看| 久久久久久久久久国产| 国产精品久久久| 欧美激情视频在线观看| 欧美激情喷水视频| 2018日韩中文字幕|