我创建了一个Room数据库,将消息存储在聊天应用程序中,并按如下方式定义了表:
@Entity(tableName = "message_table")
public class Message {
@NonNull
@PrimaryKey(autoGenerate = true)
public long id;
@NonNull
public String body;
@NonNull
@ColumnInfo(name = "phone_number")
public String phoneNumber;
public Message(String body, String phoneNumber) {
this.body = body;
this.phoneNumber = phoneNumber;
}
}
当我查询给定电话号码的所有消息时,它可以完美地检索它们(使用以下查询):
@Query("SELECT * FROM message_table WHERE phone_number = :phoneNumber LIMIT 50")
LiveData<List<Message>> getMessagesByNumber(String phoneNumber);
但是,当我尝试使用以下命令删除与完全相同的电话号码关联的所有消息时,每次都会删除0行:
@Query("DELETE FROM message_table WHERE phone_number = :phoneNumber")
int delete(String phoneNumber);
我在这里错过了什么吗?我环顾四周,但似乎找不到解决方案。 (而且我已经四遍检查了“选择”和“删除”呼叫中使用的电话号码是100%相同的字符串)。
答案 0 :(得分:1)
根据@Faisal对问题的评论。我忘了在后台线程中运行删除方法。
我将删除代码移至AsyncTask,现在可以正常工作了。这是存储库功能任务:
private static class deleteAsyncTask extends AsyncTask<Void, Void, Void> {
private MessageDao mAsyncTaskDao;
private String mPhoneNumber = null;
public deleteAsyncTask(MessageDao dao) {
mAsyncTaskDao = dao;
}
public deleteAsyncTask(MessageDao dao, String phoneNumber) {
mAsyncTaskDao = dao;
mPhoneNumber = phoneNumber;
}
@Override
protected Void doInBackground(Void... voids) {
if (mPhoneNumber == null) {
mAsyncTaskDao.deleteAll();
}
else {
mAsyncTaskDao.delete(mPhoneNumber);
}
return null;
}
}
答案 1 :(得分:0)
我在从FTS3 SQLite虚拟表中删除记录时遇到了类似的问题。用单引号括住数字对我有帮助。