类关系,NullPointerException错误

时间:2015-04-01 07:07:01

标签: java android realm

我有两类作者和书籍:

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()。添加(书籍);

可能有什么不对?我求你帮忙。

2 个答案:

答案 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编码约定相矛盾。您最好将其称为urlBasesetUrlBase/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中指定的必需参数,但无论您选择什么,都必须在开始操作之前初始化图书清单