3

你可能还记得我之前关于 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吗?

4

3 回答 3

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);
于 2013-01-14T14:28:32.140 回答
1

conv.getMessageList只返回一个 java 列表。在此处添加消息不会将其保存到数据库中。您需要通过 将消息保存到数据库messageDao

于 2013-01-10T09:40:50.507 回答
0

只是一个猜测:在调用msg.setConversation(conv)之前,您的对话是否持续存在?通过引入健全性检查确保:

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(请参阅代码中的注释)。

于 2013-01-13T12:31:41.250 回答