当前位置: 首页 > 知识库问答 >
问题:

没有主键,领域Android无法复制或更新对象

范文昌
2023-03-14

我使用以下架构,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中包含的Song已经存在于域中,违反了主键约束。

一种解决方案是将收藏夹歌曲标签设置为主键:

public class FavoriteSong extends RealmObject { 
    @Primary
    String label;
    Song song;
}

然后使用CopToRealmOrUpdate()而不是CopToRealm(),它在插入之前检查所有关系的主键:

realm.copyToRealmOrUpdate(favoriteSong);

这是可行的,但不幸的是我不能这样做,因为可能有几首FavoriteSongs具有相同的标签,而主键不允许这样做。

任何想法,我如何将一个 FavoriteSong 添加到没有主键的领域,并且它不会失败主键约束?

共有2个答案

高奇
2023-03-14

使用

import io.realm.annotations.PrimaryKey; 

而不是

import androidx.room.PrimaryKey;
高溪叠
2023-03-14

请试一下

FavoriteSong favoriteSong = ...favorite song from server
mRealm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Song tempSong = favoriteSong.getSong();
            favoriteSong.setSong(null);
            FavoriteSong savedFavoriteSong = realm.copyToRealm(favoriteSong);
            Song dbSong = realm.where(Song.class).equalTo(SongFields.ID, tempSong.getId()).findFirst();
            if(dbSong == null) {
                dbSong = realm.copyToRealmOrUpdate(tempSong);
            }
            savedFavoriteSong.setSong(dbSong);
        }

松菲尔德假设你正在使用 https://github.com/cmelchior/realmfieldnameshelper

 类似资料:
  • 问题内容: 我是快速入门的新手。我想做一个复合主键,当我尝试这样的事情时: 我收到此错误:对象’DbLocation’上不存在’主键属性’uuid’ 任何人都可以通过示例为我提供帮助,该示例如何创建复合主键? 问题答案: 对于领域: 用法示例: 当然,你可以玩弄各种使用上的听众和,以确保compoundKey才能正确重写每一个值换衣服的时间。 对于领域: 自定义设置器确保compoundKey始终

  • 我已经开始在Android上使用Realm了。到目前为止,我很喜欢它,但我在试图理解如何正确使用“copyToRealmOrUpdate”时遇到了一些问题。 每次打开应用程序时,我都会收到一个带有X“contacts”的JSON(我正在将它映射到Contact RealmObject数组中),如果它们不存在,我想将它们插入Realm DB,或者在它们存在时更新它们。 这里的问题是,每次我这样做时,

  • 问题内容: 启动应用程序时,我将执行API调用以查看是否有可用的新数据。数据存储在我的本地Realm数据库中,其中一些显示在初始表视图控制器中。 API调用完成后,我将检查是否满足某些条件,这些条件要求我从数据库中删除一堆先前的数据,然后创建新对象。但是,当我删除旧数据时,我的应用程序崩溃,但出现以下异常: 该调用堆栈让我假设,这是由于我在FavoriteLeaguesViewController

  • 我刚到Spring 我尝试使用spring rest api和Hibernate更新Mysql中的一个现有值。但它每次都会抛出一个错误。 错误消息:

  • 我在Postgres中有两个表<code>foo 当我尝试使用此命令将数据从 复制到 时: 我得到一个错误: 错误:重复的键值违反了唯一约束“bar_pkey” 详细信息:键(id)=(1)已存在。 当表