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.getMessageListJava リストのみを返します。そこにメッセージを追加しても、データベースには保存されません。経由でメッセージをデータベースに保存する必要があります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 に答える