Android - 存储对象列表的最佳方式(存储聊天记录)

时间:2018-03-20 12:51:07

标签: android android-room

所以我正在编写一个聊天应用程序,我需要在本地存储每个用户的聊天记录。我正在使用Room来做这件事。

用户类:

@PrimaryKey
@NonNull
private String userid;
private String name;;

@TypeConverters(Object_Converter.class)
private ArrayList<Message> messages = new ArrayList<>();

我遇到的问题是更新邮件列表。

我目前正在使用默认的@Update方法:

@Update
void updateUser(User user);

所以基本上每当我的监听器收到一条消息时,它都会通过Id请求用户,然后获取消息列表然后添加到消息中,最后调用updateUser。

我的问题是这种方法对性能的不利影响,因为我假设updateUser只是用新的消息覆盖了整个消息列表?可以每隔一段时间收到消息,这是他们存储和更新用户聊天记录的更好方法吗?

2 个答案:

答案 0 :(得分:1)

你是对的。更新将覆盖所有消息。最好将消息存储在自己的表中,并使用外键来发送和接收用户。基本上你的信息看起来像这样:

@Entity(tableName = "message", foreignKeys = {
    @ForeignKey(
            entity = User.class,
            parentColumns = "userid",
            childColumns = "senderId",
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
    ),
    @ForeignKey(
            entity = User.class,
            parentColumns = "userid",
            childColumns = "receiverId",
            onDelete = ForeignKey.CASCADE,
            onUpdate = ForeignKey.CASCADE
    )
}, indices = {
        @Index("senderId"),
        @Index("receiverId")
})
public class Message {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public String senderId;
    public String receiverId;
    public String content;
    // ... other stuff
}

然后您只需在需要时插入和删除消息。当您想要检索邮件时,您可以使用userid检索邮件,或者您可以连接表并创建另一个模型类,其中包含用户和已发送和已接收邮件的列表。

将列表存储为列并不是一个好主意,因为它表明需要新表。有关更多信息,请参阅database normal form

答案 1 :(得分:0)

这更多是关于数据库的设计,而不是实现。 我会这样解决这个问题: 您可以为Messages创建新的数据库实体,并使用外键来连接这两个实体。这将是一对多关系,每个用户可以拥有更多消息。然后,您只需在第二个表中插入每个新消息,并获取带有查询的消息列表,即:

"SELECT message FROM messages WHERE userid = :id"

或类似的东西。重点是,您需要更改数据库结构。