繁体   English   中英

Android房间数据库删除不起作用?

[英]Android room database delete is not working?

我做了一些简单的测试项目,但我在删除时遇到了一些麻烦。 它不会工作。 我可以正常添加联系人,但是当我尝试删除它时,没有任何反应并且我没有任何错误。 这是我的代码:

实体

@Entity
public class Contact {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "contact_name")
    private String contactName;

    @ColumnInfo(name = "contact_number")
    private String contactNumber;

    @ColumnInfo(name = "contact_image")
    @Nullable
    private String contactImage;

...

我的道:

@Dao
public interface ContactDao {

    @Query("SELECT * FROM Contact")
    LiveData<List<Contact>> getContacts();

    @Query("SELECT * FROM Contact WHERE id = :contact_id")
    Contact getContactById(int contact_id);

    @Insert
    void addContact(Contact contact);

    @Delete
    void deleteContact(Contact contact);
}

ViewModel:

public class ContactViewModel extends AndroidViewModel {

    private LiveData<List<Contact>> contacts;
    private ContactsDatabase contactsDatabase;

    public ContactViewModel(@NonNull Application application) {
        super(application);

        contactsDatabase = ContactsDatabase.getINSTANCE(this.getApplication());
        contacts = contactsDatabase.contactDao().getContacts();
    }

    public LiveData<List<Contact>> getContacts() {
        return contacts;
    }

    public void deleteContact(Contact contact) {
        new deleteAT(contactsDatabase).execute(contact);
    }

    private class deleteAT extends AsyncTask<Contact, Void, Void> {

        private ContactsDatabase contactsDatabase;

        deleteAT(ContactsDatabase db) {
            this.contactsDatabase = db;
        }

        @Override
        protected Void doInBackground(Contact... contacts) {
            contactsDatabase.contactDao().deleteContact(contacts[0]);
            return null;
        }
    }
}

任何解决方案?

查看生成的 addContact() 代码。 它不会在您的 Contact 实例上设置 id,因此您需要自己完成。

@Entity
public class Contact {
    @PrimaryKey(autoGenerate = true)
    private long id;

    //...
}

@Dao
public interface ContactDao {
    @Insert
    long addContact(Contact contact); //returns autogenerated id

    @Delete
    void deleteContact(Contact contact);
}

那么这应该工作:

long insertedId = dao.addContact(contact);
contact.setId(insertedId);
dao.deleteContact(contact);

要详细说明其他答案,您可以简单地使用contact.setId(myDatabase.addContact(contact))

然后稍后您的本地联系人实例将具有正确的 ID 集,允许在必要时将其删除。

还值得注意的是,这种情况仅在第一次生成主键时才有可能,因为可以插入没有主键的条目,但不可能从没有主键的数据库中提取预先存在的条目。

在某些情况下,最好添加自定义删除 by-id 而不是使用自动生成的 delete by-object。

在这种情况下,它会是

    @Query("DELETE FROM Contact WHERE id = :contact_id")
    void deleteContactById(int contact_id);

有关更多信息,请参阅https://stackoverflow.com/a/47554641/6513193

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM