FlutterでRealmDBを使用する方法について
概要
導入
realmとは、軽量、高速なDBライブラリである。
まず、realmを導入する。
ターミナルにて、以下を実行する。
flutter pub add realmDB定義
次に、DBの定義を行う。
クラスで定義を行うが、その際@RealmModel()アノテーションを付ける。
これによりRealmクラスだと認識される。
必ず、PrimaryKeyを定義する。これには、ObjectIdかIntが使用できる。
まだこの段階で値が入らないときは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 generatemodelを変更する際には、上記ファイルを変更して、再度、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 = ""
});
}