2016-11-24 118 views
0

我有一个领域的问题,我尝试填充领域与我的数据我从json得到它,并解析json和每件事情准备就绪,我使用它,但它坠毁我的应用程序,这是我的代码Realm PrimaryKey约束异常

private void putDataInRealm(ArrayList<Movie> resultObj) { 
    realm.beginTransaction(); 
    for (Movie item : resultObj) { 
     movieDb = realm.createObject(MovieDb.class); 
     movieDb.setMovieID(item.getId()); 
     movieDb.setTitle(item.getTitle()); 
     movieDb.setDate(item.getDate()); 
     movieDb.setOverview(item.getOverview()); 
     movieDb.setRate(item.getRate()); 
     movieDb.setVote(item.getVote()); 
     movieDb.setBackdrop_path(item.getBackdrop()); 
    } 
    realm.commitTransaction(); 
} 

知道我下载的境界,我作出这样

RealmConfiguration configuration = new RealmConfiguration.Builder(this).name("Movie_data_base.realm").build(); 
    Realm.setDefaultConfiguration(configuration); 

我的错误我的配置是

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.massive.movieapp, PID: 27784 
       io.realm.exceptions.RealmPrimaryKeyConstraintException: Value already exists: 
        at io.realm.internal.Table.throwDuplicatePrimaryKeyException(Table.java:675) 
        at io.realm.internal.Table.addEmptyRow(Table.java:404) 
        at io.realm.Realm.createObject(Realm.java:696) 
        at com.massive.movieapp.FragmentForActivity.putDataInRealm(FragmentForActivity.java:135) 
        at com.massive.movieapp.FragmentForActivity.onPostExcuteCallBack(FragmentForActivity.java:150) 
        at com.massive.movieapp.Url_cont.onPostExecute(Url_cont.java:128) 
        at com.massive.movieapp.Url_cont.onPostExecute(Url_cont.java:25) 
        at android.os.AsyncTask.finish(AsyncTask.java:651) 
        at android.os.AsyncTask.-wrap1(AsyncTask.java) 
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我的设备是nexus 7 api 23

回答

2

这正是错误所说的。您正尝试将对象放入数据库中,但它已经有一个与@PrimaryKey-annotated字段具有相同值的对象。主键在定义上是唯一的 - 它必须确定和引用数据库中的一个对象。

一个简单的方式来解决这种情况下,是创建MovieDB作为非托管对象,然后使用realm.insertOrUpdate方法(购自V1.1.0),其将检查具有相同键的物体的存在,以及更新它如果存在或创建一个新的,如果它不:

private void putDataInRealm(ArrayList<Movie> resultObj) { 
    realm.beginTransaction(); 
    for (Movie item : resultObj) { 
     MovieDb movieDb = new MovieDb(); 
     movieDb.setMovieID(item.getId()); 
     movieDb.setTitle(item.getTitle()); 
     movieDb.setDate(item.getDate()); 
     movieDb.setOverview(item.getOverview()); 
     movieDb.setRate(item.getRate()); 
     movieDb.setVote(item.getVote()); 
     movieDb.setBackdrop_path(item.getBackdrop()); 
     realm.insertOrUpdate(movieDb); 
    } 
    realm.commitTransaction(); 
} 
+0

当我把realm.insertOrUpdate(movieDb); android studio说不能解决这个问题 –

+2

你使用的是什么版本的realm?这是最新的吗?它必须是至少1.1.0方法是在那里https://realm.io/docs/java/2.2.0/api/或者,也许MovieDb不扩展RealmObject或RealmModel? – maciekjanusz

+0

MovieDb正在扩展RealmObject,我的领域是io.realm:realm-android:0.84.1 –

1

这是因为你应该指定创建RealmObject的ID。 (可用自0.90.0)

for (Movie item : resultObj) { 
    movieDb = realm.createObject(MovieDb.class, item.getId()); 
    //movieDb.setMovieID(item.getId()); 

或者你可以使用非托管对象和插入(自1.1.0)

for (Movie item : resultObj) { 
    movieDb = new MovieDb(); 
    movieDb.setMovieID(item.getId()); 
    ... 
    realm.insertOrUpdate(movieDb); 

但在旧时代,你会做以下

for (Movie item : resultObj) { 
    movieDb = new MovieDb(); 
    movieDb.setMovieID(item.getId()); 
    ... 
    realm.copyToRealmOrUpdate(movieDb); 
+0

你为什么不工作它给错误我不能在MovieDb.class旁边的任何东西 –

+1

然后,你应该更新你的Realm版本至少1.1.1,因为这个功能被添加到0.90.0。这是1.5年前。 – EpicPandaForce

+1

这里是一个升级指南http://stackoverflow.com/questions/39971209/upgrade-realm-in-an-android-project/39974275#39974275 – EpicPandaForce