我有一个每秒多次填充数据的领域数据库。我将数据库视为绘制的 MPChartLib 数据。我的目标是在特定时间点拍摄数据库的照片,并在稍后重用该信息。
我正在尝试几种方法,但都陷入了僵局。我的第一种方法是拥有第二个 Realm 数据库,我将在单击按钮时将第一个数据库中的信息填充到该数据库中。我的第二种方法是将数据库导出到一个文件,然后再重新打开它。
在我的第一种方法中,我在 onCreateView 中构建了两个数据库,如下所示。我将 mRealm 用作动态变化的 Realm,将 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);
以及每个配置的 buildDatabase 代码
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;
}
}
}
当 mRealm 数据库完成它的事务时,我测试以查看 recordData 标志是否已通过按钮推送设置为 true。如果是这样,那么我将数据库导出为文件和/或尝试将静态数据库快照更新为动态数据库的当前状态。
// 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 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();
}
要复制到我正在使用的静态库:
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 ");
我想去一个新的片段并使用静态数据库。在新片段的 onCreateView 中,我尝试创建一个指向静态领域的配置:
// 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();
但是,我无法对此进行测试,因为我的代码在我尝试的副本处停止。对于文件方法,我尝试通过已将其重写为片段并将其包含在我的项目中的 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 的结构,但也许我在设置原始目录时遇到了问题。我不太清楚如何利用“常驻”领域以及如何参考重新打开它们、获得正确的路径等。
可能是我的问题在于引用,或者我在获取新实例时不知道足够的细节。也许我错过了一些基本的东西。
非常感谢任何帮助。