【问题标题】:Realm PrimaryKey Constraint Exception领域 PrimaryKey 约束异常
【发布时间】:2017-04-09 05:57:24
【问题描述】:

我的领域有问题我尝试用我的数据填充领域

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

【问题讨论】:

    标签: android realm


    【解决方案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);
    

    【讨论】:

    • 你为什么不工作它给出错误我不能在 MovieDb.class 之外做任何事情
    • 那么你应该在一天内将你的 Realm 版本更新到至少 1.1.1,因为这个功能是在 0.90.0 中添加的。那是 1.5 年前的事了。
    • 请告诉我如何将最新版本的领域放入我的 android studio 我知道这个愚蠢的问题,但我需要答案
    • 正如official documentation 所提到的,您需要将其添加到项目级构建gradle:classpath "io.realm:realm-gradle-plugin:1.1.1" 并将其添加到模块级构建gradle:apply plugin: 'realm-android'
    【解决方案2】:

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

    解决这种情况的一种简单方法是将MovieDB 创建为unmanaged 对象,然后使用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();
    }
    

    【讨论】:

    • 当我把 realm.insertOrUpdate(movieDb); android studio 说不能解决这个方法
    • 您使用的是什么版本的领域?是最新的吗?它必须至少为 1.1.0 方法是否存在 realm.io/docs/java/2.2.0/api 或者 MovieDb 没有扩展 RealmObject 或 RealmModel?
    • MovieDb 正在扩展 RealmObject,我的领域是 io.realm:realm-android:0.84.1
    • 你能给我发来自领域的最新版本
    • 最新版本的文档可在此处realm.io/docs/java/latest 获得,尽管由于正在进行大量重大更改,更新并不是那么简单。您可能应该尝试更新到 0.88.3。,它也使用 Gradle 插件解决方案,而不仅仅是 compile 'io.realm...
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多