国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Flutter持久化存儲(chǔ)之?dāng)?shù)據(jù)庫存儲(chǔ)(sqflite)詳解

2019-10-21 21:19:24
字體:
供稿:網(wǎng)友

前言

數(shù)據(jù)庫存儲(chǔ)是我們常用的存儲(chǔ)方式之一,對(duì)大批量數(shù)據(jù)有增、刪、改、查操作需求時(shí),我們就會(huì)想到使用數(shù)據(jù)庫,F(xiàn)lutter中提供了一個(gè)sqflite插件供我們用于大量數(shù)據(jù)執(zhí)行CRUD操作。本篇我們就來一起學(xué)習(xí)sqflite的使用。

sqflite是一款輕量級(jí)的關(guān)系型數(shù)據(jù)庫,類似SQLite。

在Flutter平臺(tái)我們使用sqflite庫來同時(shí)支持Android 和iOS。

sqflite使用

引入插件

在pubspec.yaml文件中添加path_provider插件,最新版本為1.0.0,如下:

dependencies: flutter: sdk: flutter #sqflite插件 sqflite: 1.0.0

然后命令行執(zhí)行flutter packages get即可將插件下載到本地。

數(shù)據(jù)庫操作方法介紹

1. 插入操作

插入數(shù)據(jù)操作有兩個(gè)方法:

Future<int> rawInsert(String sql, [List<dynamic> arguments]);Future<int> insert(String table, Map<String, dynamic> values, {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});

rawInsert方法第一個(gè)參數(shù)為一條插入sql語句,可以使用?作為占位符,通過第二個(gè)參數(shù)填充數(shù)據(jù)。

insert方法第一個(gè)參數(shù)為操作的表名,第二個(gè)參數(shù)map中是想要添加的字段名和對(duì)應(yīng)字段值。

2. 查詢操作

查詢操作同樣實(shí)現(xiàn)了兩個(gè)方法:

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方法第一個(gè)參數(shù)為操作的表名,后邊的可選參數(shù)依次表示是否去重、查詢字段、WHERE子句(可使用?作為占位符)、WHERE子句占位符參數(shù)值、GROUP BY子句、HAVING子句、ORDER BY子句、查詢的條數(shù)、查詢的偏移位等。

rawQuery方法第一個(gè)參數(shù)為一條查詢sql語句,可以使用?作為占位符,通過第二個(gè)參數(shù)填充數(shù)據(jù)。

3. 修改操作

修改操作同樣實(shí)現(xiàn)了兩個(gè)方法:

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方法第一個(gè)參數(shù)為一條更新sql語句,可以使用?作為占位符,通過第二個(gè)參數(shù)填充數(shù)據(jù)。

update方法第一個(gè)參數(shù)為操作的表名,第二個(gè)參數(shù)為修改的字段和對(duì)應(yīng)值,后邊的可選參數(shù)依次表示W(wǎng)HERE子句(可使用?作為占位符)、WHERE子句占位符參數(shù)值、發(fā)生沖突時(shí)的操作算法(包括回滾、終止、忽略等等)。

4. 刪除操作

修改操作同樣實(shí)現(xiàn)了兩個(gè)方法:

Future<int> rawDelete(String sql, [List<dynamic> arguments]);Future<int> delete(String table, {String where, List<dynamic> whereArgs});

rawDelete方法第一個(gè)參數(shù)為一條刪除sql語句,可以使用?作為占位符,通過第二個(gè)參數(shù)填充數(shù)據(jù)。

delete方法第一個(gè)參數(shù)為操作的表名,后邊的可選參數(shù)依次表示W(wǎng)HERE子句(可使用?作為占位符)、WHERE子句占位符參數(shù)值。

舉個(gè)栗子

我們以圖書管理系統(tǒng)來舉例。

首先,我們創(chuàng)建一個(gè)書籍類,包括書籍ID、書名、作者、價(jià)格、出版社等信息。

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]; }}

其次,我們開始實(shí)現(xiàn)數(shù)據(jù)庫相關(guān)操作:

1. 創(chuàng)建數(shù)據(jù)庫文件和對(duì)應(yīng)的表

// 獲取數(shù)據(jù)庫文件的存儲(chǔ)路徑 var databasesPath = await getDatabasesPath(); String path = join(databasesPath, 'demo.db');//根據(jù)數(shù)據(jù)庫文件路徑和數(shù)據(jù)庫版本號(hào)創(chuàng)建數(shù)據(jù)庫表 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操作實(shí)現(xiàn)

 // 插入一條書籍?dāng)?shù)據(jù) 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; } // 根據(jù)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; } // 根據(jù)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. 關(guān)閉數(shù)據(jù)庫

數(shù)據(jù)庫對(duì)象使用完之后要在適當(dāng)?shù)臅r(shí)候關(guān)閉掉,可在helper類中實(shí)現(xiàn)以下方法。

Future close() async => db.close();

事務(wù)

sqflite同時(shí)支持事務(wù),通過事務(wù)可以將多條原子操作放在一起執(zhí)行,保證操作要么全部執(zhí)行完成,要么都不執(zhí)行。
比如有兩條書籍?dāng)?shù)據(jù)必須全部插入書庫中才算添加成功,則使用如下方法

 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中我們常用的幾個(gè)操作,有了sqflite我們就可以開發(fā)更豐富的應(yīng)用程序,在開發(fā)實(shí)踐中大家遇到任何問題都可以給我們發(fā)消息反饋,大家一起交流探討共同進(jìn)步。針對(duì)一些用戶的反饋我們將在下一篇介紹Flutter的代碼調(diào)試。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 克什克腾旗| 富顺县| 鱼台县| 永胜县| 湛江市| 海林市| 赤水市| 黄浦区| 吴桥县| 玉环县| 贵港市| 资阳市| 陕西省| 突泉县| 福贡县| 镇江市| 宜黄县| 神池县| 阿克陶县| 元江| 南充市| 荣成市| 松原市| 榆林市| 青田县| 渑池县| 同仁县| 亳州市| 周至县| 淳化县| 班戈县| 岳普湖县| 绥中县| 枣阳市| 澄江县| 道孚县| 舟山市| 沙田区| 吉首市| 崇文区| 贵州省|