Flutter中數(shù)據(jù)庫的使用教程詳解
在Flutter開發(fā)過程中,我門有時候需要對一些數(shù)據(jù)進行本地的持久化存儲,使用sp文件形式雖然也能解決問題,但是有時數(shù)據(jù)量較大的時候,顯然我們文件形式就不太合適了,這時候我們就需要使用數(shù)據(jù)庫進行存儲,我們知道在原生中有系統(tǒng)提供的輕量級sqlite數(shù)據(jù)庫,在Flutter強大的生態(tài)環(huán)境中,也有這樣一個數(shù)據(jù)庫插件sqflite: ^2.0.2可以同時在Androud、iOS中進行數(shù)據(jù)庫操作。
1、 創(chuàng)建數(shù)據(jù)庫:這里我以存儲我的搜索歷史記錄為例。
首先導入:
import 'package:sqflite/sqflite.dart';
這里我創(chuàng)建了一個數(shù)據(jù)庫幫助類,為了以后數(shù)據(jù)庫更新、升級等作準備:
代碼實現(xiàn):主要是對Database這個類的獲取進行了封裝。
/// 數(shù)據(jù)庫幫助類
class DbHelper {
final String path = "laoli.db"; // 數(shù)據(jù)庫名稱 一般不變
//數(shù)據(jù)庫中的表名字 這里是我存錯歷史搜索記錄的表
static final searchTab = "SearchHistory";
//私有構造
DbHelper._();
static DbHelper? _instance;
static DbHelper get instance => _getInstance();
factory DbHelper() {
return instance;
}
static DbHelper _getInstance() {
if (_instance == null) {
_instance = DbHelper._();
}
return _instance ?? DbHelper._();
}
/// 數(shù)據(jù)庫默認存儲的路徑
/// SQLite 數(shù)據(jù)庫是文件系統(tǒng)中由路徑標識的文件。如果是relative,
/// 這個路徑是相對于 獲取的路徑getDatabasesPath(),
/// Android默認的數(shù)據(jù)庫目錄,
/// iOS/MacOS的documents目錄。
Future<Database>? _db;
Future<Database>? getDb() {
_db ??= _initDb();
return _db;
}
// Guaranteed to be called only once.保證只調用一次
Future<Database> _initDb() async {
// 這里是我們真正創(chuàng)建數(shù)據(jù)庫的地方 vserion代表數(shù)據(jù)庫的版本,如果版本改變
//,則db會調用onUpgrade方法進行更新操作
final db =
await openDatabase(this.path, version: 1, onCreate: (db, version) {
// 數(shù)據(jù)庫創(chuàng)建完成
// 創(chuàng)建表 一個自增id 一個text
db.execute("create table $searchTab (id integer primary key autoincrement, name text not null)");
}, onUpgrade: (db, oldV, newV) {
// 升級數(shù)據(jù)庫調用
/// db 數(shù)據(jù)庫
/// oldV 舊版本號
// newV 新版本號
// 升級完成就不會在調用這個方法了
});
return db;
}
// 關閉數(shù)據(jù)庫
close() async {
await _db?.then((value) => value.close());
}
}在java后臺開發(fā)過程中,數(shù)據(jù)庫肯定都會分層設計,這樣的好處可以在使用的過程中極大的提高代碼的健壯性以及降低后期的維護成本,在移動前端雖然我們用數(shù)據(jù)庫的地方跟后臺相比少之又少,但是我還是建議也對數(shù)據(jù)庫進行分層處理操作,雖然不分層也能實現(xiàn),但是這樣也可以降低我們的對于代碼的維護成本以及良好的編程習慣。廢話不多說,接下來我們需要創(chuàng)建處理數(shù)據(jù)的dao層。
這里sqflite封裝了一些常用的sql語法,比如增刪改查,我們就不需要自己去寫sql語法了,這里我簡答封裝了下增刪改查的方法。
具體代碼:
/// 數(shù)據(jù)操作類
class DbSearchHistoryDao {
/// 增
static insert(String text) {
// 去重
queryAll().then((value) {
bool isAdd = true;
for (var data in value) {
if (data.name == text) {
isAdd = false;
break;
}
}
if (isAdd) {
DbHelper.instance.getDb()?.then((value) => value.insert(
DbHelper.searchTab,
DbSearchHotBean(name: text).toJson(),
));
}
});
}
/// 刪 全部
static deleteAll() {
DbHelper.instance.getDb()?.then((value) => value.delete(
DbHelper.searchTab,
));
}
/// 更新數(shù)據(jù) 通過id更新表內具體行的數(shù)據(jù)
static update(DbSearchHotBean dbSearchHotBean) {
DbHelper.instance.getDb()?.then((value) => value.update(
DbHelper.searchTab,
dbSearchHotBean.toJson(),//具體更新的數(shù)據(jù)
where: "id = ?"http://通過id查找需要更新的數(shù)據(jù)
,whereArgs: [dbSearchHotBean.id]
));
}
/// 通過name查具體的實體類
static Future<DbSearchHotBean?> getBean(String name) async {
var db = await DbHelper.instance.getDb();
var maps = await db?.query(DbHelper.searchTab,
columns: ['id','name'],// 獲取實體類的哪些字段 默認全部
where: 'name = ?',//通過實體類中的name字段
whereArgs: [name]);//具體name的值 限定數(shù)據(jù)
if(maps!=null && maps.length > 0) {
return DbSearchHotBean.fromJson(maps.first);
}
return null;
}
/// 查 全部all
static Future<List<DbSearchHotBean>> queryAll() async {
List<DbSearchHotBean> list = [];
await DbHelper.instance
.getDb()
?.then((db) => db.query(DbHelper.searchTab).then((value) {
for (var data in value) {
list.add(DbSearchHotBean.fromJson(data));
}
}));
return list;
}
}實體類:雖然只有一個字段,但是創(chuàng)建實體類方便以后擴展。
class DbSearchHotBean {
int? id;
String? name; // 搜索詞
DbSearchHotBean({this.id,required this.name});
DbSearchHotBean.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, String?> toJson() {
var map = <String, String?>{};
map['id'] = id?.toString() ;
map['name'] = name ?? "";
return map;
}
}具體用法就非常簡單了:
增:DbSearchHistoryDao.insert(”搜索詞“);
刪全部:DbSearchHistoryDao.deleteAll();
改:例如將水改為火, 找到水的實體通過自增id修改name
DbSearchHistoryDao.getBean("水").then((value){
if(value!=null){
DbSearchHistoryDao.update(DbSearchHotBean(id: value.id,name: "火"));
}
});查全部:await DbSearchHistoryDao.queryAll();
到這里數(shù)據(jù)庫的基本用法就介紹完了,當然部分操作比如刪指定數(shù)據(jù),批量修改、批量刪除等操作可以用 到批處理操作,這里就不過多介紹了,有需要的可以查看作者文檔。鏈接
batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();總結
數(shù)據(jù)庫操作總體上沒什么難度,但是當我們數(shù)據(jù)量比較多的時候,數(shù)據(jù)表結構的設計就有一定的技術含量了,還有就是我們對于一些sql語句的掌握,因為此插件幫我們封裝了常用的功能,如果有比較特殊的需求,還是需要我們掌握一定的sql語法才行,這里就簡單的介紹一些常用的方法,在移動前端估計也基本夠用了~
到此這篇關于Flutter中數(shù)據(jù)庫的使用教程詳解的文章就介紹到這了,更多相關Flutter數(shù)據(jù)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android中gravity、layout_gravity、padding、margin的區(qū)別小結
這篇文章主要介紹了Android中gravity、layout_gravity、padding、margin的區(qū)別小結,需要的朋友可以參考下2014-08-08
Android使用ViewDragHelper實現(xiàn)QQ聊天氣泡拖動效果
這篇文章主要為大家詳細介紹了Android使用ViewDragHelper實現(xiàn)QQ聊天氣泡拖動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
android教程使用webview訪問https的url處理sslerror示例
這篇文章主要介紹了android教程使用webview訪問https的url處理sslerror示例,大家參考使用吧2014-01-01
Android TextView顯示Html類解析的網頁和圖片及自定義標簽用法示例
這篇文章主要介紹了Android TextView顯示Html類解析的網頁和圖片及自定義標簽用法,實例分析了Android中TextView控件的使用技巧,需要的朋友可以參考下2016-07-07
Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實現(xiàn)思路
本文通過實例代碼給大家講解了Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實現(xiàn)思路及解決方案,需要的朋友參考下吧2017-05-05
Android編程實現(xiàn)通過反射獲取資源Id的方法
這篇文章主要介紹了Android編程實現(xiàn)通過反射獲取資源Id的方法,結合實例形式分析了Android反射機制操作資源的相關實現(xiàn)技巧,需要的朋友可以參考下2018-01-01

