2016-08-29 8 views
0

Я создаю приложение чата в Android, используя sqlite-расширения для создания связей между таблицами базы данных. Вот стена кода для установки сцены:От многих до многих отношений, которые не обновляются должным образом в 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); 
     } 
    } 

Может кто-то пожалуйста, посмотрите на мой код и сказать мне, что случилось?

ответ

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

То же самое происходит с вашей второй части кода.