【问题标题】:'RealmNoticeModelClass' has a primary key, use 'createObject(Class<E>, Object)' instead'RealmNoticeModelClass' 有一个主键,使用 'createObject(Class<E>, Object)' 代替
【发布时间】:2016-10-18 07:22:08
【问题描述】:

在将 Realm 从 1.1.0 升级到 2.0.2 之后。我在交易对象时收到此错误。在早期版本中它工作正常。

io.realm.exceptions.RealmException: 'RealmNoticeModelClass' 有一个主键,请改用'createObject(Class, Object)'。

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                 Process: com.rana.sahaj.myyu, PID: 20202
                                                                 io.realm.exceptions.RealmException: 'RealmNoticeModelClass' has a primary key, use 'createObject(Class<E>, Object)' instead.
                                                                     at io.realm.Realm.createObjectInternal(Realm.java:821)
                                                                     at io.realm.Realm.createObject(Realm.java:802)
                                                                     at com.rana.sahaj.myyu.notice.NoticeOnItemSelectedActivity$1$2.onSuccess(NoticeOnItemSelectedActivity.java:162)
                                                                     at com.rana.sahaj.myyu.notice.NoticeOnItemSelectedActivity$1$2.onSuccess(NoticeOnItemSelectedActivity.java:156)
                                                                     at com.google.android.gms.tasks.zze$1.run(Unknown Source)
                                                                     at android.os.Handler.handleCallback(Handler.java:733)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5052)
                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
                                                                     at dalvik.system.NativeStart.main(Native Method)

代码是

 realm.beginTransaction();
                    RealmNoticeModelClass realmNoticeModelClass = realm.createObject(RealmNoticeModelClass.class);
                    realmNoticeModelClass.setDocUrl(DocUrl1);
                    realmNoticeModelClass.setHashname(heading);
                    realmNoticeModelClass.setContent(contentString);
                    realmNoticeModelClass.setTime(getIntent().getExtras().getString("notice_time"));
                    realmNoticeModelClass.setPicurl(picUrlName);
                    realmNoticeModelClass.setUserPic(getIntent().getExtras().getString("image_user_notice"));
                    realmNoticeModelClass.setPdfUrl(PdfUrl);
                    realmNoticeModelClass.setPicOffline(SnapshotKey);
                    realmNoticeModelClass.setMetaType(null);
                    realmNoticeModelClass.setTimeStamp(SnapshotKey);
                    realm.commitTransaction();

n RealmNoticeModelClass

public class RealmNoticeModelClass extends RealmObject {
@PrimaryKey
private String timeStamp;
private String Content;
@Index
private String UserPic;
private String Hashname;
private String picurl;
private String time;
private String picOffline;
private String pdfUrl;
private String docUrl1;
private String metaType;

public String getMetaType() {
    return metaType;
}

public void setMetaType(String metaType) {
    this.metaType = metaType;
}

public String getDocUrl() {
    return docUrl1;
}
 ... other getters setters
}

【问题讨论】:

    标签: java android realm


    【解决方案1】:

    自 Realm 2.0.0 以来,主键是不可变的,这意味着您在创建对象后无法修改它们。

    考虑到您有一个主键,创建对象时应设置其主键值。

    在你的情况下,这个主键是

    @PrimaryKey
    private String timeStamp;
    

    这意味着,这行代码会失败:

    RealmNoticeModelClass realmNoticeModelClass = 
       realm.createObject(RealmNoticeModelClass.class);
    realmNoticeModelClass.setTimeStamp(snapshotKey /* primaryKeyValue*/);
    

    应该是的

    RealmNoticeModelClass realmNoticeModelClass = 
       realm.createObject(RealmNoticeModelClass.class, snapshotKey /* primaryKeyValue */);
    

    【讨论】:

    • 什么是快照键?
    • 可以看到原问题,是timestamp字段的值,是他的主键值
    • 谢谢,所以我们现在应该将主键作为参数传递。少了一行代码,太棒了!现在真的可以了!
    • 这应该在 Realm Doc 中提到。我在问自己 safeThread 将如何处理它。谢谢
    • @MaherAbuthraa 但它在realm.io/docs/java/latest/api/io/realm/…中这么说
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2020-08-30
    • 2012-06-27
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多