java - 如何避免在 Room Db 的表中重复输入数据?

标签 java android sqlite android-room

我正在使用 RoomDb 将消息存储在使用房间数据库的设备中。每个消息都包含一个唯一的 Id,它是在服务器上存储消息时生成的。 当一条消息被下载并存储在房间数据库中时,如果我再次尝试下载该消息,它就会被下载并保存到房间数据库中。

我试过使用替换策略,但还是不行

 @Insert(onConflict = OnConflictStrategy.REPLACE)
    void saveMessage(ArrayList<Message> messages);

上面的代码应该替换现有的消息,但它并没有这样做。

消息模型如下所示。

public class Message {

    @Exclude
    @PrimaryKey(autoGenerate = true)
    public long _id;

    @Exclude
    @ColumnInfo(name = "messageId")
    public String id;

    @Exclude
    public boolean outbox;
    @Exclude
    public boolean pending;

    @Exclude
    public boolean draft;

    @Exclude
    @ColumnInfo(typeAffinity = ColumnInfo.BLOB)
    public byte[] thumbnail;
    @Exclude
    public boolean downloaded;
    @Exclude
    public boolean seen;
    @Exclude
    public boolean liked;
    @Exclude
    public boolean disliked;
    @Exclude
    public String path;     // Local attachment path

    @Exclude
    public String localFilePath; //Local attachment file path

    public String title;
    public String body;
    public String type;
    public String image;
    public String file;
    public String audio;
    public String video;


}

最佳答案

你必须像这样改变你的实体类

在 Java 中

@Entity(tableName = "chat_message_table", indices = @Index(value = {"messageId"}, unique = true))
public class Message {
...
}

在 Kotlin 中

@Entity(tableName = "chat_message_table", indices = [Index(value = ["messageId"], unique = true)])
data class Message(@ColumnInfo(name = "messageId") val messageId: String) {
 @PrimaryKey(autoGenerate = true)
 var _Id: Int = 0
 ...
 }

关于java - 如何避免在 Room Db 的表中重复输入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49829672/

相关文章:

sqlite - 升级 SQFLITE : Unhandled Exception: DatabaseException(table UsernameTable has no column named rememberMe (Sqlite code 1):

java - 在 struts 应用程序中的 db 中 24 小时后引发的事件

android - getItem(getCount() - getPosition() -1) 是如何工作的

android - 如何使用推送通知同步 SQLite 和 MySQL 数据库?

java - 如何将句子中的单词存储在java命令提示符中的单独字符串中

Android:使用 xml 布局的日期选择器

iphone - SQLite 管理器 - 将表复制到另一个 .sqlite 数据库

java - 如何在不重启服务器的情况下将 EAR 文件重新部署到 Web-Logic?

java - LocalDateTime 解析抛出 "java.lang.IllegalArgumentException: Unknown pattern letter: T"

java - R.id安卓工作室