【发布时间】:2017-02-08 17:56:58
【问题描述】:
我正在使用以下架构,Realm 定义了一个拥有收藏歌曲列表的用户:
public class User extends RealmObject {
@PrimaryKey
Long id;
RealmList<FavoriteSong> favoriteSongs;
}
public class FavoriteSong extends RealmObject {
String label;
Song song;
}
public class Song extends RealmObject {
@PrimaryKey
Long id;
String title;
}
我的应用模型基本上反映了服务器模型。所以当我收到一首新的 FavoriteSong 时,我想将它保存到领域:
FavoriteSong favoriteSong = ...favorite song from server
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// Add a new FavoriteSong
realm.copyToRealm(favoriteSong); // Fails with Value already exists: 0
}
这会失败,因为FavoriteSong 中包含的歌曲已经存在于领域中,违反了主键约束。
一种解决方法是将FavoriteSong标签设置为主键:
public class FavoriteSong extends RealmObject {
@Primary
String label;
Song song;
}
然后使用copyToRealmOrUpdate()代替copyToRealm(),它在插入之前检查所有关系的主键:
realm.copyToRealmOrUpdate(favoriteSong);
这可行,但不幸的是我不能这样做,因为可以有多个具有相同标签的收藏歌曲,而主键不允许这样做。
知道如何在没有主键且不违反主键约束的情况下将 FavoriteSong 添加到领域吗?
【问题讨论】:
-
您来自服务器的
FavoriteSong是否包含song;? -
@EpicPandaForce - 是的
-
这是您问题的根源:
FavoriteSong没有主键,但copyToRealm()会尝试将对象与喜欢的歌曲一起保存在其中 -
那你为什么不给
FavoriteSong添加唯一的ID呢?例如,使用UUID.randomUUID()。这样你就不会得到重复。FavoriteSongs 对于这个特定用户是唯一的吗?我不太了解您的模型之间的关系。 -
@Darwind - 是的,最喜欢的歌曲对这个用户来说是独一无二的,FavoriteSong 的服务器模型有一个“userId”字段,但我觉得没有必要在我的模型中包含它,因为有只有一个用户。为了详细说明这种关系,我们使用 FavoriteSong 的“label”字段作为类别指示符,因此我可以拥有多个带有“Classical”或“Hip-Hop”标签的喜爱歌曲。可能不是最好的组织方式,但这是后端开发人员决定构建的方式。