Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从EditActivity中删除文件室条目?_Android_Android Room_Delete Row - Fatal编程技术网

Android 如何从EditActivity中删除文件室条目?

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

我有一个适配器和RecyclerView来显示本地保存的联系人列表。当用户单击一个条目时,一个新的活动将启动,用户可以在其中编辑它。但是,我还希望在最底部有一个“删除”按钮来删除条目,然后返回适配器活动。使用房间的删除查询或其他方式,如何从EditContact活动中删除条目

在ContactDao中,我有以下内容:

// 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();

        }