0

我正在使用 sqlite-extensions 在 Android 中创建一个聊天应用程序,以创建数据库表之间的关系。这是设置舞台的代码墙:

对话表

public class Conversation
{
    [PrimaryKey, Unique, AutoIncrement]
    public int ID { get; set; }
    public string toUser { get; set; }
    public string FromUser { get; set; }

    [ManyToMany(typeof(ChatConversation), CascadeOperations = CascadeOperation.All)]
    public List<ChatMessage> ChatMessages { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<ConversationDeleted> DeletedConversations { get; set; }
    public DateTime CreatedAt { get; set; }

    public int UserID { get; set; }


}

聊天消息表

    public class ChatMessage
{
    [PrimaryKey, Unique, AutoIncrement]
    public int ChatMessageID { get; set; }
    public string fromUser { get; set; }
    public string toUser { get; set; }
    public string Message { get; set; }
    public bool DeliveryStatus { get; set; }
    public DateTime CreatedAt { get; set; }

    [Unique, AutoIncrement, NotNull]
    public Guid UniqueID { get; set; }

    [ManyToMany(typeof(ChatConversation), CascadeOperations = CascadeOperation.All)]
    public List<Conversation> Conversation { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<MessageDeleted> MessagesDeleted { get; set; }
    public int UserId { get; set; }

}

用于聊天和对话表关系的中间表

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

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

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

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

4

1 回答 1

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

您的第二段代码也是如此。

于 2016-08-30T10:35:30.637 回答