2016-03-23 2 views
0

でLinkedListのように使用されます。私は最初のエントリを削除し、最後に1つを追加して固定サイズにするLinkedListアプローチでこれを行い、MPChartLibをプロットします。これは、私がRealmデータベースを使用して模倣したいものです。レルムは、私は次のコンストラクタを有するセンサ値のレルムデータベースを持っているアンドロイド

私のアプローチは、最初に以下のコード使用して最初のエントリを削除するには、次のとおりです。

private void removeFirst(){ 
    RealmResults<DataEntry> result1 = mRealm.where(DataEntry.class).findAll(); 


    mRealm.beginTransaction(); 
    Log.i(TAG, "remove the first element of the database "); 
    DataEntry first =result1.first(); 
    first.removeFromRealm(); 
    Log.i(TAG, "shift the indexes of the database by one " + result1.size()); 

     for (int i = 0; i < result1.size(); i++) { 
      DataEntry u = result1.get(i); 
      int index = u.getxIndex(); 
      u.setxIndex(index - 1); 
      String xValue = "" +index; 
      u.setxValue(xValue); 
     } 
    mRealm.commitTransaction(); 
} 

をその後、私は

@Subscribe 
public void onSensorUpdatedEvent(SensorUpdatedEvent event) { 
    if (event.getSensor().getId() == this.sensor.getId()) { 
//  Log.i(TAG, "remove the first element of the database "); 
     removeFirst(); 
     mRealm.beginTransaction(); 


     DataEntry entry = mRealm.createObject(DataEntry.class); 
    //  Log.i(TAG, "in database update event with index = " + nextIndex); 
     entry.setxIndex(nextIndex); 
     entry.setxValue("" + nextIndex); 
     nextIndex++; 
     entry.setAndroidDevice(mAndroidId); 
     entry.setTimestamp(event.getDataPoint().getTimestamp()); 
     currT.setText(precsion.format(event.getDataPoint().getTimestamp())); 
     if (event.getDataPoint().getValues().length > 0) { 
      entry.setX(event.getDataPoint().getValues()[0]); 
      currX.setText(precsion.format(event.getDataPoint().getValues()[0])); 
     } else { 
      entry.setX(0.0f); 
     } 

     if (event.getDataPoint().getValues().length > 1) { 
      entry.setY(event.getDataPoint().getValues()[1]); 
      currY.setText(precsion.format(event.getDataPoint().getValues()[1])); 
     } else { 
      entry.setY(0.0f); 
     } 

     if (event.getDataPoint().getValues().length > 2) { 
      entry.setZ(event.getDataPoint().getValues()[2]); 
      currZ.setText(precsion.format(event.getDataPoint().getValues()[2])); 
     } else { 
      entry.setZ(0.0f); 
     } 
     deltaT.setText(precsion.format((event.getDataPoint().getTimestamp() - lastT)/scaleT)); 
     lastT = event.getDataPoint().getTimestamp(); 
     entry.setAccuracy(event.getDataPoint().getAccuracy()); 
     mRealm.commitTransaction(); 

    } 
} 

取得したデータから新しいデータポイントを追加MPChartLibに沿って位置を確立するためにXINDEXを使用しています私はこれらの値をremoveFirstクラスの一部として変更します。 MpChartLibの私の結果は私に望ましい結果を与えません。私はそのアプリケーションを超えてそれを使用しているかもしれません、または私は正しい方法でレルムを使用していないかもしれません。

どのような意味があるのは、100個の空のデータベースエントリで始まり、100個に達してからエントリ1がエントリ0になり、エントリ99が98になり、エントリ99に新しいデータを追加します。

私はこれがうまくいくと思いますが、100個の固定データベースポイントの値をシフトすることは非常に非効率的です。

私はLinkedListで行うことができるように、最初のものを削除して最後に新しいものを追加する方が好きです。

どのように進んでいくのかが分かりません。どんな支援も大歓迎です。

答えて

2

RealmQuery.findAll()は、安定した結果を得ることはできません。それを達成するには、いくつかのフィールドに基づいて結果を並べ替える必要があります。

@PrimaryKeyRealmQuery.max()を使って結合できると思います。

public class DataEntry { 
    @PrimaryKey 
    private long id; 
    // ... 
} 

private void addEntry(DataEntry entry){ 
    realm.beginTransaction(); 
    RealmResults<DataEntry> results = realm.where(DataEntry.class).findAllSorted("id"); 
    if (results.count.size() >= 100) { 
    // Remove the first entry 
     results.get(0).removeFromRealm(); 
    } 
    // NOTE: Consider the integer overflow and the empty results here!!!! 
    entry.setId(restuls.max("id").longValue() + 1; 
    realm.copyToRealm(entry); 
    realm.commitTransaction(); 
} 

idは範囲[1-100]には含まれませんが、達成するために数学を行うことができると思います。

+0

ありがとう、これは私を軌道に戻した –

0

基本キーと並べ替えを使用すると、ビーイングが推奨されます。タイムスタンプをプライマリキーとして変更し、MPChartLibが必要とすると思われるタイムスタンプの文字列バージョンを追加しました。

は、だから私のDataEntryレルムデータベース

@RealmClass 
public class DataEntry extends RealmObject { 

private String sTimestamp; 
private String androidDevice; 

private float x; 
private float y; 
private float z; 
private int accuracy; 

@PrimaryKey 
private long timestamp; 

// no arguments constructor for Realm database 
public DataEntry() { 
} 

public DataEntry(float x, float y, float z, long timestamp, String sTimestamp) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    this.timestamp = timestamp; 
    this.sTimestamp = sTimestamp; 
} 

し、データベースを更新するためのコードは:

@Subscribe 
public void onSensorUpdatedEvent(SensorUpdatedEvent event) { 
    if (event.getSensor().getId() == this.sensor.getId()) { 

     mRealm.beginTransaction(); 
     RealmResults<DataEntry> results = mRealm. 
       where(DataEntry.class).findAllSorted("timestamp"); 
     if (results.size() == 1) { 
      startTime = results.get(0).getTimestamp(); 
//   Log.i(TAG, "first data received: startTime " + startTime); 
     } 
//   Log.i(TAG, "check size of the database " +results.size()); 
     if (results.size() >= 100) { 
//   Log.i(TAG, "remove the first element of the database "); 
      results.get(0).removeFromRealm(); 
     } 
//   Log.i(TAG, "create element for the database "); 
     DataEntry entry = mRealm.createObject(DataEntry.class); 

     entry.setAndroidDevice(mAndroidId); 
     long mTime = (long) (event.getDataPoint().getTimestamp()-startTime); 
//  Log.i(TAG, "time set at = " +mTime); 
     entry.setTimestamp(mTime); 
//  currT.setText(precsion.format(mTime)); 
     entry.setsTimestamp(String.valueOf(mTime)); 
     if (event.getDataPoint().getValues().length > 0) { 
      entry.setX(event.getDataPoint().getValues()[0]); 
      currX.setText(precsion.format(event.getDataPoint().getValues()[0])); 
     } else { 
      entry.setX(0.0f); 
     } 

     if (event.getDataPoint().getValues().length > 1) { 
      entry.setY(event.getDataPoint().getValues()[1]); 
      currY.setText(precsion.format(event.getDataPoint().getValues()[1])); 
     } else { 
      entry.setY(0.0f); 
     } 

     if (event.getDataPoint().getValues().length > 2) { 
      entry.setZ(event.getDataPoint().getValues()[2]); 
      currZ.setText(precsion.format(event.getDataPoint().getValues()[2])); 
     } else { 
      entry.setZ(0.0f); 
     } 
     deltaT.setText(precsion.format((event.getDataPoint().getTimestamp() - lastT)/scaleT)); 
     totalT = ((event.getDataPoint().getTimestamp() - lastT)/scaleT) * results.size()/1000; 
     totalTText.setText(String.valueOf(totalT)); 
     lastT = event.getDataPoint().getTimestamp(); 
     entry.setAccuracy(event.getDataPoint().getAccuracy()); 
//   Log.i(TAG, "copy element to the database "); 
     mRealm.copyToRealm(entry); 
//   Log.i(TAG, " database has size = " + results.size()); 
     mRealm.commitTransaction(); 

    } 
} 

は、その後、私はとOKだ

private void setData() { 
//  Log.i(TAG, "In setData perform database query , sort by timestamp"); 
    RealmResults<DataEntry> result1 = mRealm.where(DataEntry.class).findAllSorted("timestamp"); 
//  Log.i(TAG, "set Database size is = " + result1.size()); 
//  Log.i(TAG, "Extract x data "); 
    RealmLineDataSet<DataEntry> set1 = new RealmLineDataSet<>(result1, "x"); 
    set1.setDrawCubic(false); 
    set1.setLabel("Realm X"); 
    set1.setDrawCircleHole(false); 
    set1.setColor(ColorTemplate.rgb("#FF5722")); 
    set1.setCircleColor(ColorTemplate.rgb("#FF5722")); 
    set1.setLineWidth(1.8f); 
    set1.setCircleSize(3.6f); 
//  Log.i(TAG, "Extract y data "); 
    RealmLineDataSet<DataEntry> set2 = new RealmLineDataSet<>(result1, "y"); 
    set1.setDrawCubic(false); 
    set1.setLabel("Realm Y"); 
    set1.setDrawCircleHole(false); 
    set1.setColor(ColorTemplate.rgb("#FF5722")); 
    set1.setCircleColor(ColorTemplate.rgb("#FF5722")); 
    set1.setLineWidth(1.8f); 
    set1.setCircleSize(3.6f); 
//  Log.i(TAG, "Extract z data "); 
    RealmLineDataSet<DataEntry> set3 = new RealmLineDataSet<>(result1, "z"); 
    set1.setDrawCubic(false); 
    set1.setLabel("Realm Z"); 
    set1.setDrawCircleHole(false); 
    set1.setColor(ColorTemplate.rgb("#FF5722")); 
    set1.setCircleColor(ColorTemplate.rgb("#FF5722")); 
    set1.setLineWidth(1.8f); 
    set1.setCircleSize(3.6f); 
//  Log.i(TAG, "add datasets "); 
    ArrayList<ILineDataSet> dataSets = new ArrayList<>(); 
    dataSets.add(set1); 
    dataSets.add(set2); 
    dataSets.add(set3); 
//  Log.i(TAG, "Create Line Data for graphing "); 
    RealmLineData lineData = new RealmLineData(result1, "sTimestamp", dataSets); 
//  Log.i(TAG, "Set Data on Chart "); 
    mChart.setData(lineData); 
//  Log.i(TAG, "Re-draw "); 
    mChart.invalidate(); 
} 

MPChartLib形式にデータを設定しますx軸ラベルを持たないので、巨大な数です。私の計画は、軸のラベルを止めることです。

関連する問題