在Sqlite-Extensions中,多对多关系无法正确更新

时间:2016-08-29 15:29:17

标签: sqlite-net-extensions

我在Android中使用sqlite-extensions创建了一个聊天应用,用于在数据库表之间创建关系。 这是设置阶段的代码墙:

对话表

    class ChatConversation
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof(Conversation))]
    public int ConversationID { get; set; }

    [ForeignKey(typeof(ChatMessage))]
    public int ChatID { get; set; }
}

ChatMessage表

            string messageText = messageET.Text.ToString();
            if (TextUtils.IsEmpty(messageText))
            {
                return;
            }
            var member = dbr.GetMember(loggeduser);
            var uniqueID = Guid.NewGuid();
            proxySubscriber.InvokeSendMessage(user, messageText, uniqueID);
            ChatMessage chatMessage = new ChatMessage();
            chatMessage.Message = messageText;
            chatMessage.fromUser = loggeduser;
            chatMessage.toUser = user;
            chatMessage.CreatedAt = DateTime.Now;
            chatMessage.UniqueID = uniqueID;
            chatMessage.UserId = member.UserID;
            dbr.insertUpdateChat(chatMessage);
            var duplicat_chat_msg = dbr.GetChat().ToList().Where(u => u.UniqueID == uniqueID).FirstOrDefault();
            List<ChatMessage> msg_list = new List<ChatMessage>();
            msg_list.Add(duplicat_chat_msg);
            var update_conv = dbr.GetConversations().Where(f => f.FromUser == loggeduser && f.toUser == user && f.UserID == member.UserID).FirstOrDefault();
            var deleted_conversation = dbr.GetConversationDeleted().Where(d => d.UserID == member.UserID && d.ConversationID == update_conv.ID).FirstOrDefault();
            bool HasConversation = false;
            if (deleted_conversation != null)
            {
                HasConversation = true;
            }

            if (update_conv != null && !HasConversation)
            {
                update_conv.ChatMessages.Add(duplicat_chat_msg);
                dbr.UpdateConversationData(update_conv);
            }
            else
            {
                Conversation conv = new Conversation { ChatMessages = msg_list, CreatedAt = DateTime.Now, FromUser = loggeduser, toUser = user, UserID = member.UserID };
                dbr.insertConversationData(conv);
            }
            displayMessage(chatMessage);
            messageET.Text = "";
        };

聊天和对话表关系的中介表

var member = dbr.GetMember(loggedonuser);
            chat_msg.DeliveryStatus = true;
            var chat = dbr.GetChat().ToList().Where(c => c.UniqueID == chat_msg.UniqueID).FirstOrDefault();
            if (chat == null)
            {
                dbr.insertUpdateChat(chat_msg);
            }
            var conversation = dbr.GetConversations().Where(f => f.toUser == chat_msg.toUser && f.FromUser == chat.fromUser && f.UserID == member.UserID).FirstOrDefault();
            var deleted_conversation = dbr.GetConversationDeleted().Where(d => d.UserID == member.UserID && d.ConversationID == conversation.ID).FirstOrDefault();
            bool HasConversation = false;
            if (deleted_conversation != null)
            {
                HasConversation = true;

            }


            if (conversation == null && !HasConversation)
            {
                Conversation conv = new Conversation { toUser = chat_msg.toUser, FromUser = chat_msg.fromUser, CreatedAt = DateTime.UtcNow, UserID = member.UserID };
                conv.ChatMessages = new List<ChatMessage> { chat_msg };
                dbr.insertConversationData(conv);

            }
            else
            {
                conversation.ChatMessages.Add(chat_msg);
                dbr.UpdateConversationData(conversation);
            }

当我向用户发送消息时,它会创建一个与聊天消息对象级联的新会话。当我在同一台设备上登录其他用户的帐户时,会创建一个新会话,并且该聊天消息会与之级联。现在的问题是,在用户收到消息之后,第一个用户创建的对话与聊天消息之间形成的关系不再存在。 用户在此发送消息:

        public string insertConversationData(Conversation data)
    {
        try
        {

            {
                db.InsertOrReplaceWithChildren(data, recursive:true);
            }


            return "Single data file inserted or updated";
        }
        catch (SQLiteException ex)
        {
            Thread.Sleep(500);
            return insertConversationData(data);
        }
    }

用户在此处收到聊天内容:

{{1}}

当发送者创建对话时,在发送的对话和聊天消息之间形成关系,但是当第二用户接收到该消息时,该关系被破坏并且在消息的接收者创建的对话之间形成新的关系。由于关系是多对多的,这不应该发生。这是将对话插入db:

的地方
{{1}}

有人可以查看我的代码并告诉我有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您必须考虑到调用UpdateWithChildren将保存对象的当前状态。

所以你现在正在做的事情相当于:

update_conv.ChatMessages.RemoveAll();
update_conv.ChatMessages.Add(message);

因为添加新邮件时ChatMessages为空。

在更新时,SQLite-Net Extensions将删除所有关系,但因为新列表看起来像是什么。

添加以下行:

update_conv.GetChildren();

这一行之后:

var update_conv = dbr.GetConversations().Where(f => f.FromUser == loggeduser && f.toUser == user && f.UserID == member.UserID).FirstOrDefault();

第二段代码也是如此。