2015-04-01 57 views
1

我有两个类作者和图书的:类关系,NullPointerException异常错误

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);

什么可能是错的?我请求你的帮助。

+0

提供您的getter和setter方法的代码为两个类 – Kushal 2015-04-01 07:17:54

+0

更新问题 – SmallSani 2015-04-01 07:28:00

+0

貌似前你的getBooks返回null,请检查你在哪里设置书籍作者。 – Satty 2015-04-01 07:32:40

回答

3

您没有设置books成员为您author对象(如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在上述解决方案中正确指出,该列表将被非托管。如果你想有一个管理列表传递所需的参数作为RealmListapi规定,但无论你选择的书籍列表必须初始化你开始操纵它

+0

通常这是在Java中正确的,但不是特定于领域。用构造函数创建一个'RealmList'给你一个非托管列表。 – 2015-04-01 07:43:59

+0

我明白你的意思了,我已经更新了相应的答案 – giorashc 2015-04-01 07:54:05

3

据境界的文档,你应该实例化实体对象的特殊工厂方法:

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

+0

是的!所以工作,但问题仍然与copyToRealmOrUpdate。如果所有的代码运行几次,那么数据库中的数据将被替换或添加为新的? – SmallSani 2015-04-01 07:41:39

+0

启动了一个程序2次。在第二次发布throwDuplicatePrimaryKeyException – SmallSani 2015-04-01 07:42:44

+0

@SmallSani然后按照giorashc的解决方案 – 2015-04-01 07:48:49

相关问题