你可能记得my previous question关于Green DAO中的双向关系,我有一个由对话和消息组成的聊天。
每条消息都有一个父对话,对话有一个列表消息。
当我尝试添加新消息时,只要我不关闭应用程序,它就能完美运行。
这是我用来向现有对话添加消息的代码:
我现在有我的代码执行此操作:
Conversation conv = getConversation();
List<Message> list = conv.getMessageList();
Message msg = new Message();
msg.setConversationId(conv,getId());
MessageDao.insert(msg);
list.add(msg);
conv.update();
// ConversationDao.update(conv);
当我下次打开应用程序并致电conv.getMessageList()
时,结果为空ArrayList
。
我做错了什么?
编辑:
我改变了我的代码,现在它看起来像这样:
Conversation conv= getCOnversation();
Message msg = new Message();
msg.setConversation(conv);
MessageDao.insert(msg);
conv.resetMessageList();
不幸的是,现在比以往任何时候(即使在同一次运行中),仍然致电conv.getMessageList()
会返回一个空的java.list
。
编辑2:
这里是生成器的代码(这不是真正的代码,只是对问题很重要的内容。
Entity message = schema.addEntity("Message");
message.addIdProperty().autoincrement();
Entity conversation =schema.addEntity("Conversation");
conversation.addIdProperty().autoincrement();
Property parentConversation = message.addLongProperty("parentConversation")
.getProperty();
Property messages = conversation.addLongProperty("messages").getProperty();
message.addToOne(conversation, parentConversation);
conversation.addToMany(message, messages);
编辑3
现在,而不是调用conv.getMessageList();
我运行此行,它工作正常。
List<Message> messageList = MessageDao.queryBuilder()
.where(Properties.parentConversation.eq(conv.getId())
.list()
我怀疑在执行这一切时我或greenrobot存在一个重大问题。
这是在Session.runInTx
时运行上述代码的问题吗?
答案 0 :(得分:5)
这是有问题的部分:
Property parentConversation = message.addLongProperty("parent")
.getProperty();
Property messages = conversation.addLongProperty("messages")
.getProperty();
message.addToOne(conversation, parentConversation);
conversation.addToMany(message, messages);
对于1:N关系,您必须对ToOne和ToMany关系使用相同的属性。试试这个并重新生成代码:
Property parentConversation = message.addLongProperty("parent")
.getProperty();
message.addToOne(conversation, parentConversation);
conversation.addToMany(message, parentConversation);
答案 1 :(得分:1)
conv.getMessageList
只返回一个java列表。添加消息不会将其保存到数据库。您需要通过messageDao
将消息保存到数据库。
答案 2 :(得分:0)
只是一个猜测:您的对话是否在 之前持续调用 msg.setConversation(转化)?通过引入健全性检查确保:
Conversation conv = getConversation();
if(conv.getId() == null) {
throw new RuntimeException("Conversation not persisted: " + conv);
}
Message msg = new Message();
msg.setConversation(conv);
MessageDao.insert(msg); // Breakpoint here, is parentConversation set?
conv.resetMessageList();
如果这是问题,您必须确保对话持续存在,例如:通过调用 conversationDao.insertOrReplace(conv)。
一旦有效,您还可以考虑用此行替换 conv.resetMessageList():
conv.getMessages().add(msg); // Keep same list, also more efficient
如果这没有帮助,请调试它并检查msg是否在插入之前设置了parentConversation(请参阅代码中的注释)。