我在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}}
有人可以查看我的代码并告诉我有什么问题吗?
答案 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();
第二段代码也是如此。