2016-12-12 7 views
0

私はレルムを使ってAndroidアプリにオブジェクトを保存し始めています。ここに私が探しているものの例があります:レルム(Java)の関係を保存する

public class Item implements RealmModel { 
    String id; 
    ... 
} 

私はアイテムを表示する複数のリストを持っています。

"Best"というリストを表示しているとき、私はgetItems("Best")と呼んでいます。 List<Items>をAPIから入手しました。ここでは、このリストの保存方法を理解する必要があります。SQLiteの世界では、たとえば「custom_list_best」という新しいテーブルを作成する必要があります。最高のリストのアイテムを取得するには、ベストテーブルとアイテムテーブルの両方でジョインクエリを実行するだけです。

レルム世界で私はレルムの仕組みと、自分のモデルを構築する最善の方法を見つけようとしています。

私は当初、私はCustomListと呼ばれるオブジェクトを作成すると考えていた:

public class CustomList implements RealmModel { 
    String listId; 
    RealmList<Item> items; 
} 

私はその後、RealmList<CustomList>を格納します。しかし、唯一の問題は、すべてのアイテムに対してクエリを実行できるようにすることです。したがって、RealmList<Item>もRealmに格納する必要があります。この場合Realmはどのように機能しますか?別にRealmList<Item>を保管しておき、それぞれを保管すると、RealmList<CustomList>はデータを複製しませんか?

public class CustomList implements RealmModel { 
    String listId; 
    List<String> itemIds; 
} 

をし、オブジェクトの上からアイテムIDでのitemIdを持つItem.classオブジェクトを照会:

代わりに私が代わりに手動でこれを行うことによって、これを処理する必要がありますか?あなたは、テーブルには自動インクリメントIDと識別子とcustom_listsと呼ばれるだろう、私は「custom_list_best」新しいテーブルを作成する必要がありますSQLiteの世界では

答えて

1

いいえ、と呼ばれるテーブルに参加ID番号がcustom_listsで、IDがitemのIDを含むカスタムのリストに属しています。join_custom_lists_items

レルムの世界では、レルムの仕組みと、自分のモデルを構築するための最良の方法を理解しようとしています。

項目のIDコンクリートであり、あなたが複数のリストで同じItemを保存できるようにする必要がある場合は、両方向のリストにアクセスするために、あなたはどちらの場合もRealmList<? extends RealmModel>が必要になります。

@RealmClass 
public class Item implements RealmModel { 
    @PrimaryKey 
    private String id; 

    private RealmList<CustomList> customLists; 

    // getter setter 
} 

そして

@RealmClass 
public class CustomList implements RealmModel { 
    @PrimaryKey 
    private String title; // assuming you cannot name two lists the same? otherwise do `@Index` 

    private RealmList<Item> items; 

    // getter setter 
} 

あなたは

realm.executeTransaction(new Realm.Transaction() { 
    public void execute(Realm realm) { 
    Item item = realm.where(Item.class).equalTo(ItemFields.ID, itemId).findFirst(); // assuming exists 
    CustomList customList = realm.where(CustomList.class).equalTo(CustomListFields.TITLE, "Best").findFirst(); 
    if(customList == null) { 
     customList = realm.createObject(CustomList.class, "Best"); 
    } 
    customList.getItems().add(item); 
    item.getCustomLists().add(customList); 
    } 
} 

を行うことができます。そしてあなたは私が使用しているすべてのこのFieldsものはhttps://github.com/cmelchior/realmfieldnameshelperから

RealmResults<Item> bestItems = realm.where(Item.class) 
            .equalTo(ItemFields.CustomLists.TITLE, "Best") 
              //same as "customLists.title" 
            .findAll(); 

で問い合わせることができます。この方法