我创建了一个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%相同的字符串)。
最佳答案
根据@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;
}
}