领域PrimaryKey约束异常

时间:2016-11-24 21:27:53

标签: android realm

我有一个问题,我试图用我的数据填充领域我从json得到它并解析json后,每个东西都准备好了我使用它但它崩溃我的应用程序这是我的代码

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 个答案:

答案 0 :(得分:3)

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

修复该案例的一种简单方法是将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();
}

答案 1 :(得分:2)

那是因为您应该在创建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);