为什么这段代码会触发

java.lang.IllegalArgumentException: RealmObject is not valid, so it cannot be copied

错误?

realm.beginTransaction();
realm.delete(Booking.class);
final Booking booking = realm.copyFromRealm(
    new Booking(
        editFragment.getDestination(),
        editFragment.getDate()));
realm.commitTransaction();


但是,如果将其更改为此,则不会引发异常:

realm.delete(Booking.class);
final Booking booking = realm.createObject(
    Booking.class,
    UUID.randomUUID().toString());
booking.setDestination(editFragment.getDestination());
booking.setDate(editFragment.getDate());


有什么区别?

Booking类的定义为:

public class Booking extends RealmObject {

    @Required
    @PrimaryKey
    private String id;

    @Required
    private String destination;

    @Required
    private Date date;

    private int status;
    private boolean isNotified;

    public Booking() {
        this.id = UUID.randomUUID().toString();
        this.status = STATUS_UNAVAILABLE;
    }

    public Booking(String destination, Date date) {
        this();
        this.destination = destination;
        this.date = date;
    }

    // Getters and setters follow
}


编辑:

发现问题所在:我不小心使用了copyFromRealm而不是copyToRealm。如果您不够细心,似乎自动完成有时会对您不利。

最佳答案

您必须将有效的RealmObject传递到copyFromRealm(..)中,不足以动态创建新实例,因为新对象不会附加到Realm。


  制作已持久保存的{@link RealmObject}的独立的内存中副本。


在第二个示例中,您将创建一个新对象并将其传递给要持久化的数据库:这是两个非常不同的操作。

09-26 08:42