我有两类作者和书籍:
public class Authors extends RealmObject {
@PrimaryKey
private String url_base;
private RealmList<Books> books;
... getters & setters...
public RealmList<Books> getBooks() {
return books;
}
public void setBooks(RealmList<Books> books) {
this.books = books;
}
}
public class Books extends RealmObject {
@PrimaryKey
private String url_base;
private Authors author;
... getters & setters...
public Authors getAuthor() {
return author;
}
public void setAuthor(Authors author) {
this.author = author;
}
}
执行插入:
Authors author = new Authors();
author.setUrl_base("url_base")
Books book = new Books();
book.setUrl_base("lala");
book.setAuthor(author);
author.getBooks().add(book); // error comes here
realm.beginTransaction();
realm.copyToRealmOrUpdate(author);
realm.commitTransaction();
程序提供了java.lang.NullPointerException。
错误行: author.getBooks()。添加(书籍);
可能有什么不对?我求你帮忙。
答案 0 :(得分:3)
根据Realm文档,您应该使用特殊工厂方法实例化实体对象:
realm.beginTransaction();
Authors author = realm.createObject(Authors.class);
author.setUrl_base("url_base")
Books book = realm.createObject(Books.class);
book.setUrl_base("lala");
book.setAuthor(author);
author.getBooks().add(book); // error comes here
realm.commitTransaction();
使用构造函数实例化实体时,显然默认情况下所有字段都是null
:
public class Authors extends RealmObject {
@PrimaryKey
private String url_base; // = null
private RealmList<Books> books; // = null
... getters & setters...
}
PS:顺便说一下,使用变量名url_base
与Java编码约定相矛盾。您最好将其称为urlBase
(setUrlBase/getUrlBase
相应地)。
答案 1 :(得分:3)
您尚未为作者对象设置books
成员(因为books
未初始化为null
),因此getBooks()
将返回null
}。
确保books
在使用前已初始化:
public class Authors extends RealmObject {
@PrimaryKey
private String url_base;
private RealmList<Books> books = new RealmList<Books>(); // An empty unmanaged books list.
... getters & setters...
或使用setter方法(虽然在这种情况下在构造时初始化它会更正确):
Authors author = new Authors();
author.setUrl_base("url_base")
author.setBooks(new RealmList<Book>());
<强>更新强>
正如@AndreyAtapin在上面的解决方案中正确指出的那样,列表将不受管理。如果您希望托管列表传递RealmList
api中指定的必需参数,但无论您选择什么,都必须在开始操作之前初始化图书清单