나는 데이터베이스 테이블 간의 관계 생성을 위해 sqlite-extensions을 사용하여 Android에 채팅 앱을 만들고 있습니다.많은 관계가 Sqlite-Extensions에서 제대로 업데이트되지 않습니다
회화 표
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; }
}
ChatMessage 표
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);
}
}
사람이 내 코드를보고 무엇이 잘못되었는지 말해 주실 래요 : 대화가 DB에 삽입되는 경우 여기?