Android 如何从EditActivity中删除文件室条目?
我有一个适配器和RecyclerView来显示本地保存的联系人列表。当用户单击一个条目时,一个新的活动将启动,用户可以在其中编辑它。但是,我还希望在最底部有一个“删除”按钮来删除条目,然后返回适配器活动。使用房间的删除查询或其他方式,如何从EditContact活动中删除条目 在ContactDao中,我有以下内容:Android 如何从EditActivity中删除文件室条目?,android,android-room,delete-row,Android,Android Room,Delete Row,我有一个适配器和RecyclerView来显示本地保存的联系人列表。当用户单击一个条目时,一个新的活动将启动,用户可以在其中编辑它。但是,我还希望在最底部有一个“删除”按钮来删除条目,然后返回适配器活动。使用房间的删除查询或其他方式,如何从EditContact活动中删除条目 在ContactDao中,我有以下内容: // Delete single entry @Query("DELETE FROM contacts_table WHERE id = :userId") void delete
// Delete single entry
@Query("DELETE FROM contacts_table WHERE id = :userId")
void deleteByContactId(long userId);
联系人存储库:
public void delete(Contact contact) {
new DeleteContactAsyncTask(contactDao).execute(contact);
}
private static class DeleteContactByIdAsyncTask extends AsyncTask<Contact, Void, Void> {
private ContactDao contactDao;
private int id;
private DeleteContactByIdAsyncTask(ContactDao contactDao, int id) {
this.contactDao = contactDao;
this.id = id;
}
@Override
protected Void doInBackground(Contact... contacts) {
contactDao.deleteByContactId(id);
return null;
}
}
在dao文件中编写查询
//get a contact
@Query("select * FROM contacts_table WHERE id = :userId")
Contact getConatctByContactId(long userId);
在编辑活动中获得联系人id后,调用此函数以获取联系人
但是,由于delete函数只使用id,因此不需要检索就可以从表中删除
更新
在数据库类中声明dao
public abstract class AppDatabase extends RoomDatabase {
public abstract ContactDao contactDao();
}
并使用数据库实例调用它
database.contactPointDao().deleteContact()
我一直在尝试调试我的代码,因为我忘记在我的
DeleteContactByIdAsyncTask(contactDao,id)
结束时调用.execute()
下面是我最后的代码片段:
联系人:
// Delete single entry
@Query("DELETE FROM contacts_table WHERE id = :userId")
void deleteByContactId(long userId);
联系人存储库:
public void delete(Contact contact) {
new DeleteContactAsyncTask(contactDao).execute(contact);
}
private static class DeleteContactByIdAsyncTask extends AsyncTask<Contact, Void, Void> {
private ContactDao contactDao;
private int id;
private DeleteContactByIdAsyncTask(ContactDao contactDao, int id) {
this.contactDao = contactDao;
this.id = id;
}
@Override
protected Void doInBackground(Contact... contacts) {
contactDao.deleteByContactId(id);
return null;
}
}
在ViewContact活动中,返回结果时:
if (requestCode == EDIT_CONTACT_REQUEST && resultCode == RESULT_OK && isDeleted) {
Toast.makeText(this, "Contact Deleted", Toast.LENGTH_SHORT).show();
contactViewModel.deleteContactById(id);
onBackPressed();
}
就这样。条目将被删除,在使用RecyclerView返回活动时,条目将自动更新。确定,因此我想使用
deleteByContactId()
来简化操作。是否可以通过声明ContactDao对象,从EXTRA_ID向其传递ID,然后调用deleteByContactId()
?@George您编写的查询应该可以工作。我也这么认为,但我如何使用它?我是否必须在ContactRepository类中调用它,类似于对deleteAllContacts()的调用?是的,删除所有联系人应与此类似谢谢@TheBat。应用程序现在抱怨在主线程上访问数据库:java.lang.IllegalStateException:无法访问主线程上的数据库,因为它可能会在很长一段时间内锁定UI。
因此,正如我前面提到的,我需要通过存储库执行此操作。我还对所有异步任务以及如何使用doInBackground()感到困惑,但我也将对此进行研究。非常感谢。
if (requestCode == EDIT_CONTACT_REQUEST && resultCode == RESULT_OK && isDeleted) {
Toast.makeText(this, "Contact Deleted", Toast.LENGTH_SHORT).show();
contactViewModel.deleteContactById(id);
onBackPressed();
}