Class关系,NullPointerException错误

Class relationship, NullPointerException error

我有两个 类 作者和书籍:

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().Add (book);

有什么问题吗?我请求你的帮助。

根据 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)。

您还没有为您的作者对象设置 books 成员(因为 books 没有被初始化,它是 null)所以 getBooks() 将 return一个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 中指定的必需参数,但无论您选择什么,都必须在开始操作之前初始化书籍列表