Flutter利用ORM框架管理數(shù)據(jù)庫詳解
前言
我們前面一篇介紹了使用 floor 這個 ORM 框架處理 Flutter 本地的 SQLite 數(shù)據(jù)庫。使用 ORM 框架最大的好處是簡化了數(shù)據(jù)庫維護(hù)的代碼量,使得我們可以專注于業(yè)務(wù)代碼實現(xiàn)。在之前,我們也講到了不同 App 版本的 數(shù)據(jù)表結(jié)構(gòu)變化后,如何使用 sqflite 來處理版本升級。本篇,我們看看使用 floor 如何處理數(shù)據(jù)庫版本升級。
floor 數(shù)據(jù)庫版本升級
floor 框架同樣提供了數(shù)據(jù)庫版本號,當(dāng)前使用的版本號使用注解配置。
@Database(version: 1, entities: [Memo])
當(dāng)數(shù)據(jù)表結(jié)構(gòu)發(fā)生變化時,就需要變更版本號指定新的版本。同時需要做如下處理:
- 更新實體類:比如增加或減少字段,變更字段類型等等;
- 編寫遷移處理
Migration類對象,Migration類定義如下:
Migration(this.startVersion, this.endVersion, this.migrate)
其中第一個參數(shù)為起始版本號,第二個參數(shù)為要遷移到的版本號,最后是一個遷移處理函數(shù),函數(shù)定義為:Future<void> Function(sqflite.Database database) migrate。我們要做的數(shù)據(jù)表變動就在這個函數(shù)里處理。
將編寫好的Migration類對象添加到數(shù)據(jù)庫初始化的 addMigrations 方法中,addMigrations方法接收一個Migration對象數(shù)組,因此是支持多種遷移的,比如從版本1遷移到版本3的遷移對象,從版本2遷移到版本3的遷移對象,從而滿足多個版本同時遷移。
final database = await $FloorAppDatabase
.databaseBuilder('app_database.db')
.addMigrations([migration1to3, migration2to3])
.build();
實體類變更后,需要用代碼生成命令重新生成數(shù)據(jù)庫操作的相關(guān)代碼。
看起來非常簡單,我們來看實際的例子。
版本升級實例
我們給之前的備忘錄增加一個分類(category)字段,可以設(shè)置備忘錄的分類,分類我們簡單地固定為預(yù)設(shè)的幾類。我們按照上面的步驟一步步編寫代碼即可。
變更版本:將數(shù)據(jù)庫版本號改為2;
@Database(version: 2, entities: [Memo])
在備忘錄類增加分類字段,由于已有數(shù)據(jù)的分類字段是 null 的,因此需要設(shè)置這個字段可為空Nullable;設(shè)置為非空也可以,只是需要在遷移時給舊版本已有數(shù)據(jù)相應(yīng)字段設(shè)置非空初始值。
@entity
class Memo {
@PrimaryKey(autoGenerate: true)
final int? id;
String title;
String content;
@ColumnInfo(name: 'created_time')
DateTime createdTime;
@ColumnInfo(name: 'modified_time')
DateTime modifiedTime;
String? category;
List<String> tags;
Memo({
this.id,
required this.title,
required this.content,
required this.createdTime,
required this.modifiedTime,
this.category = '',
required this.tags,
});
}編寫數(shù)據(jù)庫遷移處理對象,并加入到版本遷移中。
final migration1to2 = Migration(1, 2, (database) async {
await database.execute('ALTER TABLE Memo ADD COLUMN category TEXT');
// 可選,設(shè)置舊版本字段初始值
await database.update('Memo',{'category': ''});
});
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final database = await $FloorMemoDatabase
.databaseBuilder('app_database.db')
.addMigrations([migration1to2]).build();
final dao = database.memoDao;
getIt.registerSingleton<MemoDao>(dao, signalsReady: true);
runApp(const MyApp());
}運行下面的命令生成代碼。
flutter packages pub run build_runner build
當(dāng)然,我們也需要對 UI 相關(guān)的代碼進(jìn)行變更,變更后的 UI 界面如下圖所示。

完整代碼已經(jīng)提交到:本地存儲相關(guān)代碼。
總結(jié)
從代碼量上來說,使用 floor 和直接使用 sqflite 處理版本遷移差不多。相比直接使用 sqflite 做數(shù)據(jù)庫版本遷移,使用 floor 的好處是可以通過添加多個 Migration 對象支持多版本遷移。
到此這篇關(guān)于Flutter利用ORM框架管理數(shù)據(jù)庫詳解的文章就介紹到這了,更多相關(guān)Flutter ORM框架管理數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Studio下的APP目錄結(jié)構(gòu)詳解
這篇文章主要介紹了AndroidStudio下的APP目錄結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Android平臺中實現(xiàn)數(shù)據(jù)存儲的5種方式
這篇文章主要為大家分享了介紹了Android平臺中實現(xiàn)數(shù)據(jù)存儲技術(shù)的5種方式,供大家學(xué)習(xí),感興趣的小伙伴們可以參考一下2016-06-06
Android編程之文件讀寫操作與技巧總結(jié)【經(jīng)典收藏】
這篇文章主要介紹了Android編程之文件讀寫操作與技巧,結(jié)合實例形式總結(jié)分析了Android常見的文件與目錄的讀寫操作,及相關(guān)函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06
Android基于ListView實現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果
這篇文章主要介紹了Android基于ListView實現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果,涉及ListView相關(guān)屬性與方法的操作技巧,需要的朋友可以參考下2016-08-08
Android中Toolbar隨著ScrollView滑動透明度漸變效果實現(xiàn)
這篇文章主要介紹了Android中Toolbar隨著ScrollView滑動透明度漸變效果實現(xiàn),非常不錯,具有參考借鑒價值,需要的的朋友參考下2017-01-01
Android自定義ListView實現(xiàn)仿QQ可拖拽列表功能
這篇文章主要介紹了Android自定義ListView實現(xiàn)仿QQ可拖拽列表功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08

