0

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

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

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

假设用户创建了一个名为“Best”的列表。当我查看从 APIgetItems("Best")获取的“最佳”列表时,我调用了该列表。List<Items>我现在必须弄清楚如何存储这个列表。例如,在 SQLite 世界中,我将创建一个新表“custom_list_best”,它只是列表中所有 Item.id 的单个列表。我还会有一个包含所有不同项目的“项目”表。要获得最佳列表中的项目,我只需对最佳和项目表进行连接查询。

在 Realm 世界中,我试图弄清楚 Realm 是如何工作的,以及构建模型的最佳方式是什么。

我最初认为我可以创建一个名为CustomList

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

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

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

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

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

4

1 回答 1

1

在 SQLite 世界中,我将创建一个新表“custom_list_best”,

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

在 Realm 世界中,我试图弄清楚 Realm 是如何工作的,以及构建模型的最佳方式是什么。

如果ID项目的 是具体的并且您需要能够将其存储Item在多个列表中,那么为了在两个方向上访问列表,您RealmList<? extends RealmModel>在两种情况下都需要 a 。

@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

于 2016-12-12T21:44:15.137 回答