溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Flutter怎么用ORM框架管理數(shù)據(jù)庫

發(fā)布時(shí)間:2023-04-17 16:20:25 來源:億速云 閱讀:104 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Flutter怎么用ORM框架管理數(shù)據(jù)庫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Flutter怎么用ORM框架管理數(shù)據(jù)庫”吧!

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

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

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

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

  • 更新實(shí)體類:比如增加或減少字段,變更字段類型等等;

  • 編寫遷移處理Migration類對(duì)象,Migration 類定義如下:

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ù)里處理。

將編寫好的Migration類對(duì)象添加到數(shù)據(jù)庫初始化的 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í)體類變更后,需要用代碼生成命令重新生成數(shù)據(jù)庫操作的相關(guān)代碼。

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

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

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

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

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

在備忘錄類增加分類字段,由于已有數(shù)據(jù)的分類字段是 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,
  });
}

編寫數(shù)據(jù)庫遷移處理對(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 界面如下圖所示。

Flutter怎么用ORM框架管理數(shù)據(jù)庫

到此,相信大家對(duì)“Flutter怎么用ORM框架管理數(shù)據(jù)庫”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI