2016-06-29 67 views
1

我從API獲取一羣用戶。當我得到這些用戶時,我刪除任何現有用戶並保存新用戶。我正在使用Android Priority Job QueueRetrofit2來提出請求。CopyToRealm - 值已存在:null

if (searchResponse != null && searchResponse.getUsers() != null) 
    { 
     realm.executeTransaction(new Realm.Transaction() 
     { 
      @Override 
      public void execute(Realm realm) 
      { 
       RealmResults<User> users = realm.where(User.class).equalTo("isOwnUser", false).findAll(); 
       users.deleteAllFromRealm(); 
       realm.copyToRealm(searchResponse.getUsers()); 
      } 
     }); 
    } 

所有的用戶都從API填充ID。但是,當我做realm.copyToRealm(searchResponse.getUsers());我得到:io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: null

回答

3

我用這個方法來解決這個問題

realm.copyToRealmOrUpdate(searchResponse.getUsers()) 
1

接受的答案的作品不過是一個壞的解決方案,因爲它隱藏了潛在的問題:

您有具有主鍵字段設置爲空的對象。這可能是一個對象,其範圍爲RealmObject,位於User對象中,未註釋爲@Ignore

以下是對可能發生的一個例子:

比方說,你User對象包含一個對象ContactInfo具有場phoneNumber被設置成主鍵。

某些User對象的phoneNumber字段ContactInfo設置爲空。

當您使用copyToRealm,境界嘗試添加所有User對象以及所有ContactInfo對象,那些User對象包含的。其中一些ContactInfo對象將主鍵字段設置爲空。這將自String,Byte,Short,IntegerLong類型的主鍵字段的主鍵字段以來第一次可以爲空。但是當你第二次這樣做的時候,你會打破主鍵約束。

使用copyToRealmOrUpdate可以工作,因爲您只需更新現有的ContactInfo對象,並將主鍵設置爲空。你可以看到這不是你想要做的,你需要確保你添加到Realm的所有對象都有適當的主鍵。