2016-08-29 2 views
0

나는 데이터베이스 테이블 간의 관계 생성을 위해 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에 삽입되는 경우 여기?

답변

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

같은 코드의 두 번째 조각으로 발생합니다.

관련 문제