Я сделал простой проект для тестирования, но у меня проблемы с удалением. Это не сработает. Я могу добавить контакт в обычном режиме, но когда я пытаюсь его удалить, ничего не происходит, и у меня нет ошибок. Вот мой код:
Юридическое лицо
@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;
}
}
}
Какие-нибудь решения?
Я получаю ссылку на модель просмотра от ViewModelProviders.of () .... И затем я вызываю deleteContact () через viewModel. Это контакт, который я ранее добавил также через viewModel. Я полагаю, что идентификатор должен быть автоматически сгенерирован, если я прав?
Взгляните на сгенерированный код addContact (). Он не устанавливает идентификатор в вашем экземпляре Contact, поэтому вам нужно сделать это самостоятельно.
@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))
Позже для вашего локального экземпляра контакта будет установлен правильный идентификатор, позволяющий при необходимости удалить его.
Также стоит отметить, что этот случай возможен только тогда, когда первичный ключ генерируется впервые, поскольку можно вставить запись без первичного ключа, но невозможно извлечь уже существующую запись из базы данных без первичного ключа.
Как вы звоните в
deleteContact()? Вы уверены, что у того контакта, который вы передаете, есть правильныйid?