2016-10-21 3 views
2

RealmResultsをリスト<と同じように管理する方法があるのだろうかと思っていました。トランザクションを通じて特定のインデックス機能を追加する簡単な方法はありますか?つまり、オブジェクトの特定のフィールドをソートする必要があるソートを使用せずに、アイテムを1つの位置からデータベースの別の位置に配置したいということです。私は、アイテムが配置されているインデックスとして位置を反映させたい。レルム - 特定の場所にオブジェクトを挿入する

要約すると、これを行う方法 - > realmResults.add(INDEX、object);レルムトランザクションを使用していますか? また、私はオブジェクトをデータベースの最初のインデックスに配置する必要があります。

+0

なぜあなたはそれを望みますか? –

+0

私はRecyclerView.AdapterのデータプロバイダとしてRealmResultsを直接使用したいと思っていました。ドラッグ&ドロップ機能を備えたグリッドビューを構築しているので、オブジェクトを再編成して位置を保存する簡単な方法が必要です。しかし、オブジェクト内のカスタムフィールドで手動で行うことは悪夢です。通常のインデックスのリストのように振る舞うことはできません。私はSQLiteとカーソルで試しましたが、それを処理する多くのクラスではさらに悪化しました。 –

+1

*オブジェクトのカスタムフィールドで手動で行うことは悪夢です*なぜですか?実際には良いアイデアのように聞こえます。それ以降も永続化されます。リスト内の一部のインデックスを変更するだけで、次回にアプリケーションを起動すると再びインデックスが異なる –

答えて

2

We talked about this on Redditとなります。解決策は、フィールドpositionを明示的に追加し、新しい要素が追加されるたびに自動的に更新されるfindAllSorted(MyObjFields.POSITION)を使用することです。

小さなデータセットの場合は、アダプタのデータセットを実際に並べ替えるには、結果リストのアンマネージコピーを作成し、並べ替えてからバックグラウンドスレッドに保存することをおすすめします。

List<Obj> unmanagedList = realm.copyFromRealm(results); 


//... 


realm.executeTransactionAsync(new Realm.Transaction() { 
    public void execute(Realm realm) { 
     for(int i = 0; i < unmanagedList.size(); i++) { 
      Obj obj = unmanagedList.get(i); 
      Obj managedObj = realm.where(Obj.class).equalTo(ObjFields.ID, obj.getId()).findFirst(); 
      if(managedObj != null) { 
       managedObj.setPosition(i); 
      } 
     } 
    } 
}); 

だけエッジケースは、新しい要素が追加されている場合は、管理対象外リストが自動更新をしないということです。これを明示的に処理する必要がある場合は、RealmChangeListener<RealmResults<Obj>>をフィールド変数として格納された結果セットに使用できます。

+0

私はまだRealmで新しく、私は疑問に思っています。そのため、最初に 'unmanagedList.add(0、newObj);'のようにオブジェクトを 'unmanagedList'に追加する必要があります。しかし、unmanagedListはRealmに直接入力されませんか?私は 'copyToRealmOrUpdate'をすべきですか?私の混乱はその領域にあります。リストに新しいオブジェクトが挿入されたばかりで、 'copyToRealm'はまだ存在しないので、同じIDを持つオブジェクトが見つからない場合は' null'になりませんか?実際、私はunmanagedListについて間違っていますか? –

+0

@KevinMurvie要点は、結果セットのアンマネージコピーを作成し、それをバッキングデータソースとして使用して、内部の位置を変更できるようにし、変更があったときに、バックグラウンドスレッド、およびRealmChangeListenerが呼び出され、バッキングデータを新しい変更可能なアンマネージコピーで更新することができます。 – EpicPandaForce

+0

ああ!それで、それはちょうどそのように管理することができますか?私はそのメソッドも使っています(管理されていないコピーを使用して 'copyOrUpdate'の内容を変更しています)が、まだ必要ではないと思ってインデックスベースの操作を試しませんでしたが、今すぐ必要です –

関連する問題