2016-03-27 1 views
0

レルム・データベースに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の構造を模倣しようとしましたが、多分私は生のディレクトリをセットアップに問題があります。私は、「居住者」の領域をどのように利用するか、そしてそれらを再オープンし、正しい経路などを取得する方法を明確にしていません。

問題が参照されているか、新しいインスタンスを取得するのに十分な詳細がわかりません。多分私は何か基本的なものを見逃しているのかも

ご協力いただきまして誠にありがとうございます。

+0

クラッシュ時の例外メッセージは何ですか? – beeender

+0

申し訳ありませんが、私はあなたの迅速な質問を逃した。ここに私が得ているものは次のとおりです: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) –

+0

上記のエラーは、私のMigrationExampleを実装しようとしたことによるものです。私のスキーマの理解が不足しているためです。定義する方法など。 –

答えて

1

私はRealm Databasesの基礎を学び、1つのフラグメント内で複数のレルムを使用することで、活発に変化するレルムのスナップショット・スタティック・レルムを保存および取得しました。

私の質問は、モデルクラスのスキーマの定義と、それらのモデルクラスが変更されたときに新しいバージョンに移行する方法を理解することがやや基本的でないことに基づいていました。レルムがどこにどこに格納されているかについての基本的な誤解とともに、

また、フラグメント間でデータを渡す方法として領域データベースを使用することの大きな利点を発見しました。私は今、私のプロジェクト内のどのフラグメントでも読み書きができる "GlobalVariables"というデータベースを持っています。私のためのフラグメントの引数はもうありません! 「ホスティング活動」を使用してフラグメント間でデータをやりとりすることができます。

私はGlobalVariablesのインスタンスを開いて、どこでもデータを取得して終了します。 また、GlobalVariablesのバリエーションをレコードとして保存して、アプリで特定の操作タイプのカスタム設定を行うことができます。

ありがとうございました、cmelchiorとRealm、bravo ...

+0

好奇心が強い、あなたはまだ2つのレルムをスナップショットに使用していますか? – beeender

+0

私のFragment DataEntryPlotでは、1秒間に何回も変化しているレルムデータベースDataEntryを見ることができます。データの外観が好きなときには、Realm.writeCopyTo(exported.realm)を実行するスナップショットボタンを押します。次に、このファイルをFragment MeasurePlotで再度開いて、このスタティックレルムの解析を行います。私がそのデータを好きであれば、MeasurePlotのスナップショットボタンを押しました。このボタンはRealm.writeCopyTo(uniqueFilename)を実行して測定値のアーカイブ保存を行います。 "ストレージ"タイプのオシロスコープのようにうまくいきます。次に、私はファイル管理のためのクラウド/暗号化されたストレージに取り組んでいます –

+0

もっと直接的に、私はテンポラリーファイルとしてエクスポートし、MeasurePlotで再び開くDataEntryPLotで活発に変化する領域を持っています。 DataEntryPlotからのすべてのエクスポートは、一時ファイルを上書きします。 –