FlutterでRealmDBを使用する方法について

概要

導入

realmとは、軽量、高速なDBライブラリである。

まず、realmを導入する。
ターミナルにて、以下を実行する。

flutter pub add realm

DB定義

次に、DBの定義を行う。
クラスで定義を行うが、その際@RealmModel()アノテーションを付ける。
これによりRealmクラスだと認識される。

必ず、PrimaryKeyを定義する。これには、ObjectIdIntが使用できる。

まだこの段階で値が入らないときはlateキーワードを使用する。
値が入るならつけない。

//person.dart
import 'package:realm/realm.dart';
 
part 'person.realm.dart'; //このコードがあるファイル名を最初に付ける。
 
@RealmModel()
class _Person{
	@PrimaryKey()
	late ObjectId id;
	late String name;
	late Int age;
	late List<String> skills;
}

そして以下をターミナルで実行する。

flutter pub run realm generate

modelを変更する際には、上記ファイルを変更して、再度、flutter pub run realm generateを行う。

realmインスタンス

realmのインスタンス作成は以下のコードで行うことができる。

class RealmInstanceFactory{
  Realm createRealmIns({required SchemaObject schemaObjectArg}){
    List<SchemaObject> schemaObject = [schemaObjectArg];
    LocalConfiguration config = Configuration.local(schemaObject);
    Realm realm = Realm(config);
    return realm;
  }
}

レコードの書き込み開始

DBの書き込みのトランザクション開始には、realm.writeを用いる。

realm.write(() => 書き込みや削除)

レコードの追加

レコードの追加には、以下のコードを使用する。

realm.write(() => realm.add( レコード情報のスキーマクラス ) )
//スキーマクラスは上記のPerson(id, name, age, skills);など

レコードの更新

addメソッド内のuptdate引数をtrueにする。

realm.write(() => realm.add( レコード情報のスキーマクラス, update = true ) )

レコードの取得

1つのレコードを追加

1つのレコードの取得には、realm.findを用いる。

var result = realm.find<スキーマの名前>(主キーの値);
//スキーマの名前には上記で言う Person を入れる。

全てのレコード追加

全てのレコードの取得には、realm.allを用いる。

List<スキーマクラス> infoResult = realm.all<スキーマの名前>().toList();

レコードの削除

1つのレコードを削除

単一のレコードの削除には、realm.deleteを用いる。

var obj = realm.find<スキーマの名前>(主キーの値);
 
realm.write(() => realm.delete<スキーマの名前>(obj));

全てのレコード削除

全てのレコードの削除には、realm.deleteAllを用いる。

realm.write(() => realm.deleteAll<スキーマの名前>());

使用できるデータ型

Transclude of 20240304104926-TalkWithAI-phind-Log-realmをFlutterで使用するとき、使用できるデータ型をすべて教えてください

スニペット

入出処理など兼ね備えたクラス

import 'package:musicalization/utils/Result.dart';
import 'package:realm/realm.dart';
import 'realmInstanceFactory.dart';
 
class RealmIOManager {
  final realmInsFac = RealmInstanceFactory();
  final _reader = _DataReader();
  final _adder = _DataAdder();
  final _editor = _DataEditor();
  late final Realm realm;
 
  RealmIOManager(SchemaObject schemaObject) {
    realm = realmInsFac.createRealmInstance(schema: schemaObject);
  }
 
  Future<void> add<T extends RealmObject>({required T newData}) async {
    _adder.add<T>(realm: realm, newData: newData);
  }
 
  List<SCHEMA> readAll<SCHEMA extends RealmObject>() {
    Result results = _reader.readAll<SCHEMA>(realm: realm);
    return results.value;
  }
 
  SCHEMA searchById<SCHEMA extends RealmObject>({required ObjectId id}) {
    var result = _reader.searchById<SCHEMA>(realm: realm, id: id);
    return result.value;
  }
 
  Future<void> edit<T extends RealmObject>({required T newData}) async {
    _editor.edit<T>(realm: realm, newData: newData);
  }
 
  void delete<SCHEMA extends RealmObject>({required ObjectId id}) {
    var obj = searchById<SCHEMA>(id: id);
    realm.write(() => realm.delete<SCHEMA>(obj));
  }
 
  void deleteAll<SCHEMA extends RealmObject>() {
    realm.write(() => realm.deleteAll<SCHEMA>());
  }
}
 
class _DataReader {
  Result searchById<SCHEMA extends RealmObject>({required Realm realm, required ObjectId id}) {
    var infoResult = realm.find<SCHEMA>(id);
 
    late Result<SCHEMA> result;
 
    if (infoResult != null) {
      result = Result(
        isSucceeded: true,
        value: infoResult
      );
    } else {
      result = Result(
        isSucceeded: false,
        errorMsg: "That record is no Exists."
      );
    }
 
    return result;
  }
 
  Result<List<SCHEMA>> readAll<SCHEMA extends RealmObject>({required Realm realm}) {
    List<SCHEMA> infoResult = realm.all<SCHEMA>().toList();
 
    return Result(isSucceeded: true, value: infoResult);
  }
}
 
class _DataAdder {
  Future<Result> add<T extends RealmObject>({required Realm realm, required T newData}) async {
    realm.write(() => realm.add(newData));
    return Result(isSucceeded: true);
  }
}
 
class _DataEditor {
  Future<Result> edit<T extends RealmObject>({required Realm realm, required T newData}) async {
    realm.write(() => realm.add(newData, update: true));
    return Result(isSucceeded: true);
  }
} 
 
//Result.dart
class Result<T>{
  final bool isSucceeded;
  final T? value;
  final String errorMsg;
 
  Result({
    required this.isSucceeded,
    this.value,
    this.errorMsg = ""
  });
}