我开始使用Realm在我的Android应用中存储对象。以下是我要存储的示例:
public class Item implements RealmModel {
String id;
...
}
我有多个显示项目的列表。列表数量可以不断扩展(用户可以创建尽可能多的列表。
让我们说用户创建一个名为" Best"的列表。当我查看" Best"我打电话给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
个对象?
答案 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