更新:
此时,我无法创建任何新的基于领域的对象。每一个失败都有相同的错误,无论我是否清理、重建等等。为了测试这一点,我创建了一个新的类“示例”:
package com.reddragon.intouch.model;
import java.util.UUID;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
public class Sample extends RealmObject {
@PrimaryKey
private String id;
private String sampleField;
public Sample() {
this(UUID.randomUUID().toString());
}
private Sample(String id) {
this.id=id;
}
public String getId(){
return id;
}
public String getSampleField() {
return sampleField;
}
public void setSampleField(String sampleField) {
this.sampleField = sampleField;
}
}在我的MainActivity.java中,我尝试创建一个新实例:
try {
MediaDataMgr.get().addSample(new Sample());
Timber.d("Lifecycle: was able to add Sample");
} catch (Exception e) {
Timber.d("Got exception instantiating Sample: %s", e.getMessage());
}这个addSample()方法使用与做工作的项目中的两个类类似的方法:
public String addSample(Sample s) {
boolean success = true;
Sample sample;
Realm realm;
String retVal = null;
boolean mainThread = Thread.currentThread().equals(Looper.getMainLooper().getThread());
if (mainThread) {
realm = mUIThreadRealm;
} else {
realm = Realm.getDefaultInstance();
}
try {
realm.beginTransaction();
sample = realm.createObject(Sample.class,s.getId()); //<--CRASH!!!!
sample.setSampleField(s.getSampleField());
} catch (Exception e ) {
Timber.d( "Exception adding a Sample: %s", e.getMessage());
success = false;
} finally {
if ( success ) {
realm.commitTransaction();
retVal = s.getId();
} else {
realm.cancelTransaction();
}
if (!mainThread) {
realm.close();
}
}
return retVal;
}我现在完全被困在这个项目上了。
更新:
我完全评论了我的应用程序中对“联系人”对象的所有引用,然后从我的项目中删除了Contact.java。我做了一个完整的重建,然后运行,一切正常。
然后,我创建了一个新的类Contact.java,并输入了与前面相同的字段,并在我的项目的其余部分中没有注释对它的引用。我做了一个重建,然后跑了-并且得到了同样的错误。
然后,我将联系人类的名称重构为ContactSharingInfo,认为在某个地方可能会出现类名冲突。重新生成并运行-相同的错误,这一次引用新的类名。
原始员额:
我正在使用gradle插件和注释处理器5.9.1。我创建了一个新的类("Contact.java"),它最初工作正常。然后我调整了类(删除了几个字段,添加了一个新字段),然后开始接收这个错误。我已经在三星的S7边缘(API 26)和几个仿真器上测试了这一点。同样的问题。
我已经做了各种方式的清理,重建,无效缓存和重新启动等,没有帮助。我复习了bug #3819和#4579,但是里面没有任何帮助。我已经停用了快跑。没有帮助。
堆栈跟踪是:
realmSet$id:111, com_reddragon_intouch_model_ContactRealmProxy (io.realm)
<init>:30, Contact (com.reddragon.intouch.model)
<init>:26, Contact (com.reddragon.intouch.model)
<init>:84, com_reddragon_intouch_model_ContactRealmProxy (io.realm)
newInstance:96, DefaultRealmModuleMediator (io.realm)
createObjectInternal:1048, Realm (io.realm)
createObject:1024, Realm (io.realm)
addContact:877, MediaDataMgr (com.reddragon.intouch.model)引起此问题的代码(在我集中处理领域访问的addContact类中的MediaDataMgr ())是:
public String addContact(Contact c, int status) {
boolean success = true;
Contact contact;
Realm realm;
String retVal = null;
boolean mainThread = Thread.currentThread().equals(Looper.getMainLooper().getThread());
if (mainThread) {
realm = mUIThreadRealm;
} else {
realm = Realm.getDefaultInstance();
}
try {
realm.beginTransaction();
contact = realm.createObject(Contact.class,c.getId()); // <--CRASH HAPPENS HERE
contact.setEmailAddress(c.getEmailAddress());
contact.setDisplayName(c.getDisplayName());
contact.setStatus(status);
} catch (Exception e ) {
Timber.d( "Exception adding a contact: %s", e.getMessage());
success = false;
} finally {
if ( success ) {
realm.commitTransaction();
retVal = c.getId();
} else {
realm.cancelTransaction();
}
if (!mainThread) {
realm.close();
}
}
return retVal;
}堆栈跟踪中引用的联系人类是:
public class Contact extends RealmObject implements CardListable {
@PrimaryKey
private String id;
private String displayName;
private String emailAddress;
private String pathToProfilePic; // This will always be a URI, but we have to store it as a string and convert to URI at runtime.
@Ignore
private int status = STATUS_UNKNOWN;
public Contact() {
this(UUID.randomUUID().toString());
}
private Contact(String id) {
this.id = id;
}
public String getId(){
return id;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getPathToProfilePic() {
return pathToProfilePic;
}
public void setPathToProfilePic(String pathToProfilePic) {
this.pathToProfilePic = pathToProfilePic;
}
public String getFirstLineDesc() {
return displayName;
}
public String getSecondLineDesc() {
return emailAddress;
}
}在调试到com_reddragon_intouch_model_ContactRealmProxy.java类时,我发现出现异常是因为调用方法public String realmSet$id()时变量'proxyState‘为null:
public void realmSet$id(String value) {
if (proxyState.isUnderConstruction()) { //<-- CRASH HAPPENS HERE
// default value of the primary key is always ignored.
return;
}
proxyState.getRealm$realm().checkIfValid();
throw new io.realm.exceptions.RealmException("Primary key field 'id' cannot be changed after object was created.");
}这使我相信,proxyState在realm$injectObjectContext()中的初始化并没有被调用。
在这个项目中,创建新对象的相同方法与另外两个类一起工作,并且我验证了在那里调用realm$injectObjectContext() 正在调用。下面是我的Media.java类(可以工作的)相同类型的构造中的堆栈跟踪:
realm$injectObjectContext:105, com_reddragon_intouch_model_MediaRealmProxy (io.realm)
<init>:52, Media (com.reddragon.intouch.model)
<init>:49, Media (com.reddragon.intouch.model)
<init>:99, com_reddragon_intouch_model_MediaRealmProxy (io.realm)
newInstance:99, DefaultRealmModuleMediator (io.realm)
createObjectInternal:1048, Realm (io.realm)
createObject:1024, Realm (io.realm)
addMedia:267, MediaDataMgr (com.reddragon.intouch.model)因此,有关如何为Contact类生成代码的内容必须与其他工作类不同--而且“某些东西”混淆了不调用该方法的领域。
该怎么办呢?
发布于 2019-03-07 18:14:14
解决办法:
就我而言,我是Lint重构的一个不知情的受害者。结果,我在类中运行了一些Lint进程,建议的更改之一是将某些构造函数更改为私有。显然,在构造函数中采用默认args的模型类中,王国不喜欢这种情况。因此,例如,Contact.java类具有以下构造函数:
public class Contact extends RealmObject implements CardListable {
@PrimaryKey
private String id;
private String displayName;
private String emailAddress;
private String pathToProfilePic; // This will always be a URI, but we have to store it as a string and convert to URI at runtime.
@Ignore
private int status = STATUS_UNKNOWN;
public Contact() {
this(UUID.randomUUID().toString());
}
private Contact(String id) { //<--NOTE PRIVATE CONSTRUCTOR
this.id = id;
}改为:
public Contact() {
this(UUID.randomUUID().toString());
}
public Contact(String id) { //<--NOTE THIS IS NOW PUBLIC
this.id = id;
}做一个clean+rebuild解决了这个问题。
https://stackoverflow.com/questions/55029853
复制相似问题