0

我有一个每秒多次填充数据的领域数据库。我将数据库视为绘制的 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 的结构,但也许我在设置原始目录时遇到了问题。我不太清楚如何利用“常驻”领域以及如何参考重新打开它们、获得正确的路径等。

可能是我的问题在于引用,或者我在获取新实例时不知道足够的细节。也许我错过了一些基本的东西。

非常感谢任何帮助。

4

1 回答 1

1

好的,所以我花了一些时间研究领域数据库的基础知识,现在已经准备好在一个片段中使用多个领域,保存和检索我活跃变化领域的快照静态领域。

我的问题是基于对模型类的模式定义以及在对这些模型类进行更改时迁移到新版本的方法的基本缺乏理解。以及对领域存储方式和位置的一些基本误解。

我还发现了使用领域数据库作为在片段之间传递数据的方法的巨大好处。我现在有一个名为“GlobalVariables”的数据库,我可以在项目中的任何片段中读取和写入。我没有更多的片段参数!或使用“托管活动”在片段之间传递数据。

我只是在任何我想要数据的地方打开一个 GlobalVariables 实例并完成!此外,我可以将 GlobalVariables 的变体存储为记录,以允许对我的应用程序上的特定操作类型进行自定义设置。

感谢 beender、cmelchior 和 Realm,太棒了……

于 2016-03-31T22:47:12.297 回答