レルム・データベースに1秒に何回もデータが取り込まれています。私はプロットされたMPChartLibデータとしてデータベースを見ています。私の目標は、特定の時点でデータベースの画像をスナップし、その情報を少し後で再利用することです。レルム・データベースのスナップショットの再利用
私はいくつかのアプローチを試みており、両方で膠着状態に達しています。私の最初のアプローチは、ボタンをクリックすると、最初のデータベースの情報を入力する2番目のRealmデータベースを作成することです。私の2番目の方法は、データベースにファイルをエクスポートし、後でそれを再度開くことです。
私の最初のアプローチでは、次のようにonCreateViewに2つのデータベースを構築します。私は、ダイナミックに変化するレルムとしてmRealmを使用しています。また、ボタンクリックでのみ変化する静的なレルムとしてmSRealmを使用しています。
// Building a Realm instance un-persisted in memory (ie not on disk)
RealmConfiguration config1 = new RealmConfiguration.Builder(getActivity())
.name("myDynamic.realm")
.inMemory()
.build();
// Building a Realm instance on disk)
RealmConfiguration config2 = new RealmConfiguration.Builder(getActivity())
.name("myStatic.realm")
.build();
Log.i(TAG, "delete previous");
Realm.deleteRealm(config2);
Realm.deleteRealm(config1); // Clean slate
Log.i(TAG, "set default configuration");
Realm.setDefaultConfiguration(config1); // Make this Realm the default
Log.i(TAG, "define an instance for this");
mRealm = buildDatabase(config1);
mSRealm = buildDatabase(config2);
Log.i(TAG, "build a Listener for database changes");
realmListener = new RealmChangeListener() {
@Override
public void onChange() {
// Log.i(TAG, "database changed");
if (startTime != 0) {
// Log.i(TAG, "off to plot");
setData();
mChart.invalidate();
}
}
};
Log.i(TAG, "add Listener ");
mRealm.addChangeListener(realmListener);
そして、それぞれのコンフィギュレーション
public Realm buildDatabase(RealmConfiguration config){
try {
Log.i(TAG, "return database since there was not already one ");
return Realm.getInstance(config);
} catch (RealmMigrationNeededException e){
try {
Log.i(TAG, "deleted database since there was one");
Realm.deleteRealm(config);
Log.i(TAG, "return new database since there was one deleted");
return Realm.getInstance(config);
} catch (Exception ex){
Log.i(TAG, "should not ever get here");
throw ex;
}
}
}
ためbuildDatabaseコードmRealmデータベースは、それは私がrecordDataのフラグは、ボタンのプッシュを経由してtrueに設定されているかどうかをテストし、トランザクションの完了しました。その場合、データベースをファイルとしてエクスポートしたり、静的データベーススナップショットを動的なスナップショットの現在の状態に更新しようとします。
public void exportDatabase(Realm mRealm) {
Log.i(TAG, "into export the database to a file ");
File exportRealmFile = null;
try {
// get or create an "export.realm" file
Log.i(TAG, "get or create file ");
exportRealmFile = new File(getActivity().getExternalCacheDir(), "export.realm");
// if "export.realm" already exists, delete
exportRealmFile.delete();
// copy current realm to "export.realm"
try {
Log.i(TAG, "write copy to file ");
mRealm.writeCopyTo(exportRealmFile);
} catch (java.io.IOException e) {
e.printStackTrace();
}
}catch (IOException e) {
e.printStackTrace();
}
は、私が使用している静的ベースにコピーするには::
// Log.i(TAG, "copy element to the database ");
mRealm.copyToRealm(entry);
// Log.i(TAG, " database has size = " + results.size());
mRealm.commitTransaction();
if (recordData) {
Log.i(TAG, "record copy to file ");
exportDatabase(mRealm);
Log.i(TAG, "record copy to static Database ");
copyToStaticDatabase(mRealm);
// Log.i(TAG, "record to singleton ");
// updateDataLab();
recordData = !recordData;
}
は、私が使用しているファイルにデータをエクスポートするには
このコードは、ポイントで死ぬpublic void copyToStaticDatabase(Realm mRealm){
Log.i(TAG, "get query of current state ");
RealmResults<DataEntry> result2 = mRealm.where(DataEntry.class).findAllSorted("timestamp");
Log.i(TAG, "delete old and create new static database ");
Realm mSRealm = buildDatabase(config2);
Log.i(TAG, "begin repopulating static database ");
mSRealm.beginTransaction();
for (int i = 0; i < result2.size(); i++) {
DataEntry entry = mSRealm.createObject(DataEntry.class);
entry.setX(result2.get(i).getX());
entry.setY(result2.get(i).getY());
entry.setZ(result2.get(i).getZ());
entry.setTimestamp(result2.get(i).getTimestamp());
entry.setAccuracy(result2.get(i).getAccuracy());
entry.setsTimestamp(result2.get(i).getsTimestamp());
mRealm.copyToRealm(entry);
}
Log.i(TAG, "finish static database ");
mSRealm.commitTransaction();
}
「取り込み開始など」がログに表示されることはないので、mSRealmの新しいインスタンスを作成することができます。私が間違って何をしているのか分かりません。
Log.i(TAG, "delete old and create new static database ");
Realm mSRealm = buildDatabase(config2);
Log.i(TAG, "begin repopulating static database ");
私は新しい断片に行き、静的データベースを使用したいと思います。私のコードは私が試みコピーで停止するので、私はしかし、これをテストすることはできません
// Building a Realm instance on disk
RealmConfiguration config = new RealmConfiguration.Builder(getActivity())
.name("myStatic.realm")
.build();
Log.i(TAG, "keep previous");
// Realm.deleteRealm(config); // Clean slate
Log.i(TAG, "set default configuration");
Realm.setDefaultConfiguration(config); // Make this Realm the default
Log.i(TAG, "define an instance for this");
mRealm = Realm.getDefaultInstance();
:新しいフラグメントでonCreateViewでは、私は、静的なレルムを指す構成を作成してみてください。ファイルのアプローチでは、MigrationExampleActivityを使って作業を試みましたが、これはフラグメントとして書き直して、バージョンの更新を通じて移行がどのように実行されるかをテストするためにプロジェクトに含めました。長期的な将来の参照のためにスナップショットをアーカイブすることが重要になるため、これはより重要になります。
これは、私が他の質問で読んだことからファイルからデータベースを「リロードする」方法だと思います。私のコードは、新しいインスタンスを取得する際に、以下の点で再びクラッシュします。
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, " in onCreate View ");
View view = inflater.inflate(R.layout.activity_realm_basic_example, container, false);
rootLayout = ((LinearLayout) view.findViewById(R.id.container));
rootLayout.removeAllViews();
Log.i(TAG, " get resources of previous database ");
copyBundledRealmFile(this.getResources().openRawResource(R.raw.default1), "default1");
Log.i(TAG, " set up new configuration ");
RealmConfiguration config1 = new RealmConfiguration.Builder(getActivity())
.name("default1")
.schemaVersion(3)
.migration(new Migration())
.build();
Log.i(TAG, " get new instance ");
realm = Realm.getInstance(config1); // Automatically run migration if needed
Log.i(TAG, " got new instance ");
showStatus("Default1");
showStatus(realm);
realm.close();
return view;
}
私は私のプロジェクトでrealmjavamasterの構造を模倣しようとしましたが、多分私は生のディレクトリをセットアップに問題があります。私は、「居住者」の領域をどのように利用するか、そしてそれらを再オープンし、正しい経路などを取得する方法を明確にしていません。
問題が参照されているか、新しいインスタンスを取得するのに十分な詳細がわかりません。多分私は何か基本的なものを見逃しているのかも
ご協力いただきまして誠にありがとうございます。
クラッシュ時の例外メッセージは何ですか? – beeender
申し訳ありませんが、私はあなたの迅速な質問を逃した。ここに私が得ているものは次のとおりです:java.lang.NullPointerException:nullオブジェクトに対して仮想メソッド 'io.realm.RealmObjectSchema io.realm.RealmObjectSchema.addRealmListField(java.lang.String、io.realm.RealmObjectSchema)'を呼び出そうとしています参照 at com.tomphyx.android.accelwear1.database.Migration.migrate(Migration.java:98) –
上記のエラーは、私のMigrationExampleを実装しようとしたことによるものです。私のスキーマの理解が不足しているためです。定義する方法など。 –