在Realm中存储关系(Java)

时间:2016-12-12 19:23:20

标签: android-sqlite realm realm-list realm-java

我开始使用Realm在我的Android应用中存储对象。以下是我要存储的示例:

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

我有多个显示项目的列表。列表数量可以不断扩展(用户可以创建尽可能多的列表。

让我们说用户创建一个名为&#34; Best&#34;的列表。当我查看&#34; Best&#34;我打电话给getItems("Best"),从API获取List<Items>。我现在必须弄清楚如何存储这个列表。在SQLite世界中,我将创建一个新表&#34; custom_list_best&#34;,例如,它只是属于列表一部分的所有Item.id的单个列表。我也有一个&#34;项目&#34;包含所有不同项的表。要获得最佳列表中的项目,我只需对最佳和项目表进行连接查询。

在Realm世界中,我试图弄清楚Realm的运作方式以及构建模型的最佳方式。

我最初认为我可以创建一个名为CustomList的对象:

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

然后我会存储RealmList<CustomList>。但唯一的问题是我也希望能够查询所有项目。所以我还需要在Realm中存储RealmList<Item>。在这种情况下,Realm如何运作?如果我存储单独的RealmList<Item>,然后存储每个RealmList<CustomList>,它是否会重复数据?

相反,我必须通过这样做来手动处理:

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

然后从上面的对象查询itemId中有itemId的Item.class个对象?

1 个答案:

答案 0 :(得分:1)

  

在SQLite世界中,我会创建一个新表&#34; custom_list_best&#34;,

不,您将拥有一个名为custom_lists的表,其中包含自动增量ID和标识符,以及一个名为join_custom_lists_items的连接表,其中包含ID custom_lists和ID属于给定自定义列表的任何item

  

在Realm世界中,我试图弄清楚Realm的运作方式以及构建模型的最佳方式。

如果项目的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);
  }
}

然后你可以查询

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

我使用的所有Fields内容都来自https://github.com/cmelchior/realmfieldnameshelper