pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

這篇文章主要給大家介紹了關于Flutter持久化存儲之數據庫存儲的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Flutter具有一定的參考學習價值,需要的朋友們下面

前言

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

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

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要介紹了Flutter實戰之自定義日志打印組件詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
這篇文章主要介紹了Flutter Http分塊下載與斷點續傳的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習
這篇文章主要給大家介紹了關于Flutter實現頁面切換后保持原頁面狀態的3種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Flutter具有一定的參考學習價值,需要的朋友
這篇文章主要給大家介紹了關于Flutter中http請求抓包的完美解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Flutter具有一定的參考學習價值,需要的朋友們下面來一
這篇文章主要給大家介紹了關于Flutter中如何獲取屏幕及Widget的寬高的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Flutter具有一定的參考學習價值,需要的朋友們
主站蜘蛛池模板: 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 山东艾德实业有限公司 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 保温杯,儿童婴童奶瓶,运动水壶「广告礼品杯定制厂家」超朗保温杯壶 | 自动钻孔机-全自动数控钻孔机生产厂家-多米(广东)智能装备有限公司 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 求是网 - 思想建党 理论强党 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 上海心叶港澳台联考一对一培训_上海心叶港澳台联考,港澳台联考一对一升学指导 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 底部填充胶_电子封装胶_芯片封装胶_芯片底部填充胶厂家-东莞汉思新材料 | 焊缝跟踪系统_激光位移传感器_激光焊缝跟踪传感器-创想智控 | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 求是网 - 思想建党 理论强党 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网| sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 |