我做了一些简单的测试项目,但我在删除方面遇到了一些麻烦。它不会起作用。我可以正常添加联系人,但是当我尝试删除它时,没有任何反应,我也没有任何错误。这是我的代码:
实体
@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;
}
}
}
任何解决方案?
答案 0 :(得分:0)
查看生成的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);
答案 1 :(得分:0)
要详细说明其他答案,您只需使用contact.setId(myDatabase.addContact(contact))
然后,在您的本地联系人实例上,将设置正确的ID,以便在必要时将其删除。
还值得注意的是,这种情况只有在第一次生成主键时才可能发生,因为可以插入没有主键的条目,但是如果没有主键就不可能从数据库中提取一个预先存在的条目键。
答案 2 :(得分:0)
在某些情况下,最好添加自定义删除 by-id 而不是使用自动生成的 delete by-object。
在这种情况下是
@Query("DELETE FROM Contact WHERE id = :contact_id")
void deleteContactById(int contact_id);
有关详细信息,请参阅 https://stackoverflow.com/a/47554641/6513193。