欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter利用ORM框架管理數(shù)據(jù)庫(kù)詳解

 更新時(shí)間:2023年04月17日 08:20:50   作者:島上碼農(nóng)  
使用?ORM?框架最大的好處是簡(jiǎn)化了數(shù)據(jù)庫(kù)維護(hù)的代碼量,使得我們可以專(zhuān)注于業(yè)務(wù)代碼實(shí)現(xiàn)。本篇,我們看看如何使用ORM框架管理數(shù)據(jù)庫(kù)版本遷移,需要的可以參考一下

前言

我們前面一篇介紹了使用 floor 這個(gè) ORM 框架處理 Flutter 本地的 SQLite 數(shù)據(jù)庫(kù)。使用 ORM 框架最大的好處是簡(jiǎn)化了數(shù)據(jù)庫(kù)維護(hù)的代碼量,使得我們可以專(zhuān)注于業(yè)務(wù)代碼實(shí)現(xiàn)。在之前,我們也講到了不同 App 版本的 數(shù)據(jù)表結(jié)構(gòu)變化后,如何使用 sqflite 來(lái)處理版本升級(jí)。本篇,我們看看使用 floor 如何處理數(shù)據(jù)庫(kù)版本升級(jí)。

floor 數(shù)據(jù)庫(kù)版本升級(jí)

floor 框架同樣提供了數(shù)據(jù)庫(kù)版本號(hào),當(dāng)前使用的版本號(hào)使用注解配置。

@Database(version: 1, entities: [Memo])

當(dāng)數(shù)據(jù)表結(jié)構(gòu)發(fā)生變化時(shí),就需要變更版本號(hào)指定新的版本。同時(shí)需要做如下處理:

  • 更新實(shí)體類(lèi):比如增加或減少字段,變更字段類(lèi)型等等;
  • 編寫(xiě)遷移處理Migration類(lèi)對(duì)象,Migration 類(lèi)定義如下:
Migration(this.startVersion, this.endVersion, this.migrate)

其中第一個(gè)參數(shù)為起始版本號(hào),第二個(gè)參數(shù)為要遷移到的版本號(hào),最后是一個(gè)遷移處理函數(shù),函數(shù)定義為:Future<void> Function(sqflite.Database database) migrate。我們要做的數(shù)據(jù)表變動(dòng)就在這個(gè)函數(shù)里處理。

將編寫(xiě)好的Migration類(lèi)對(duì)象添加到數(shù)據(jù)庫(kù)初始化的 addMigrations 方法中,addMigrations方法接收一個(gè)Migration對(duì)象數(shù)組,因此是支持多種遷移的,比如從版本1遷移到版本3的遷移對(duì)象,從版本2遷移到版本3的遷移對(duì)象,從而滿足多個(gè)版本同時(shí)遷移。

final database = await $FloorAppDatabase
    .databaseBuilder('app_database.db')
    .addMigrations([migration1to3, migration2to3])
    .build();

實(shí)體類(lèi)變更后,需要用代碼生成命令重新生成數(shù)據(jù)庫(kù)操作的相關(guān)代碼。

看起來(lái)非常簡(jiǎn)單,我們來(lái)看實(shí)際的例子。

版本升級(jí)實(shí)例

我們給之前的備忘錄增加一個(gè)分類(lèi)(category)字段,可以設(shè)置備忘錄的分類(lèi),分類(lèi)我們簡(jiǎn)單地固定為預(yù)設(shè)的幾類(lèi)。我們按照上面的步驟一步步編寫(xiě)代碼即可。

變更版本:將數(shù)據(jù)庫(kù)版本號(hào)改為2;

@Database(version: 2, entities: [Memo])

在備忘錄類(lèi)增加分類(lèi)字段,由于已有數(shù)據(jù)的分類(lèi)字段是 null 的,因此需要設(shè)置這個(gè)字段可為空Nullable;設(shè)置為非空也可以,只是需要在遷移時(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,
  });
}

編寫(xiě)數(shù)據(jù)庫(kù)遷移處理對(duì)象,并加入到版本遷移中。

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());
}

運(yùn)行下面的命令生成代碼。

flutter packages pub run build_runner build

當(dāng)然,我們也需要對(duì) UI 相關(guān)的代碼進(jìn)行變更,變更后的 UI 界面如下圖所示。

完整代碼已經(jīng)提交到:本地存儲(chǔ)相關(guān)代碼。

總結(jié)

從代碼量上來(lái)說(shuō),使用 floor 和直接使用 sqflite 處理版本遷移差不多。相比直接使用 sqflite 做數(shù)據(jù)庫(kù)版本遷移,使用 floor 的好處是可以通過(guò)添加多個(gè) Migration 對(duì)象支持多版本遷移。

到此這篇關(guān)于Flutter利用ORM框架管理數(shù)據(jù)庫(kù)詳解的文章就介紹到這了,更多相關(guān)Flutter ORM框架管理數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android服務(wù)Service教程

    Android服務(wù)Service教程

    Android的服務(wù)是開(kāi)發(fā)Android應(yīng)用程序的重要組成部分。不同于活動(dòng)Activity,服務(wù)是在后臺(tái)運(yùn)行,服務(wù)沒(méi)有接口,生命周期也與活動(dòng)Activity非常不同。通過(guò)使用服務(wù)我們可以實(shí)現(xiàn)一些后臺(tái)操作,比如想從遠(yuǎn)程服務(wù)器加載一個(gè)網(wǎng)頁(yè)等,下面來(lái)看看詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-11-11
  • Android ListView數(shù)據(jù)綁定顯示的三種解決方法

    Android ListView數(shù)據(jù)綁定顯示的三種解決方法

    本篇文章小編為大家介紹,Android ListView數(shù)據(jù)綁定顯示的三種解決方法。需要的朋友參考下
    2013-04-04
  • Android編程之藍(lán)牙測(cè)試實(shí)例

    Android編程之藍(lán)牙測(cè)試實(shí)例

    這篇文章主要介紹了Android編程之藍(lán)牙測(cè)試,較為詳細(xì)的分析了Android藍(lán)牙測(cè)試的相關(guān)運(yùn)行環(huán)境與調(diào)試技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • android圖庫(kù)豎屏不顯示status bar的解決方法

    android圖庫(kù)豎屏不顯示status bar的解決方法

    圖庫(kù)在JB和JB2的版本上顯示的行為是:橫屏全屏顯示,豎屏?xí)@示status bar,圖庫(kù)在JB和JB2的版本上顯示的行為是:橫屏全屏顯示,豎屏?xí)@示status bar,具體實(shí)現(xiàn)方法如下,不會(huì)的朋友可以參考下哈
    2013-06-06
  • Android指紋登錄工具類(lèi)封裝

    Android指紋登錄工具類(lèi)封裝

    這篇文章主要為大家詳細(xì)介紹了Android指紋登錄工具類(lèi)的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Android筆記之:App應(yīng)用之發(fā)布各廣告平臺(tái)版本的詳解

    Android筆記之:App應(yīng)用之發(fā)布各廣告平臺(tái)版本的詳解

    Android的廣告平臺(tái)是很多的,各市場(chǎng)對(duì)各平臺(tái)的接受程度是不一樣的,Android的開(kāi)發(fā)者如果想集成廣告基本要考慮下面兩個(gè)問(wèn)題
    2013-04-04
  • Android適配利用webview加載后圖片顯示過(guò)大的問(wèn)題解決

    Android適配利用webview加載后圖片顯示過(guò)大的問(wèn)題解決

    這篇文章主要給大家介紹了關(guān)于Android適配利用webview加載后圖片顯示過(guò)大問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Android組合控件自定義標(biāo)題欄

    Android組合控件自定義標(biāo)題欄

    這篇文章主要為大家詳細(xì)介紹了Android組合控件自定義標(biāo)題欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 基于Android平臺(tái)實(shí)現(xiàn)拼圖小游戲

    基于Android平臺(tái)實(shí)現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了基于Android平臺(tái)實(shí)現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android用tabhost實(shí)現(xiàn) 界面切換,每個(gè)界面為一個(gè)獨(dú)立的activity操作

    Android用tabhost實(shí)現(xiàn) 界面切換,每個(gè)界面為一個(gè)獨(dú)立的activity操作

    這篇文章主要介紹了Android用tabhost實(shí)現(xiàn) 界面切換,每個(gè)界面為一個(gè)獨(dú)立的activity操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09

最新評(píng)論