Удаление базы данных комнаты Android не работает?

Я сделал простой проект для тестирования, но у меня проблемы с удалением. Это не сработает. Я могу добавить контакт в обычном режиме, но когда я пытаюсь его удалить, ничего не происходит, и у меня нет ошибок. Вот мой код:

Юридическое лицо

@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;
        }
    }
}

Какие-нибудь решения?

Как вы звоните в deleteContact()? Вы уверены, что у того контакта, который вы передаете, есть правильный id?

Emmanuel 18.05.2018 18:07

Я получаю ссылку на модель просмотра от ViewModelProviders.of () .... И затем я вызываю deleteContact () через viewModel. Это контакт, который я ранее добавил также через viewModel. Я полагаю, что идентификатор должен быть автоматически сгенерирован, если я прав?

mark_donys 18.05.2018 20:38
3
2
5 521
2

Ответы 2

Взгляните на сгенерированный код 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))

Позже для вашего локального экземпляра контакта будет установлен правильный идентификатор, позволяющий при необходимости удалить его.

Также стоит отметить, что этот случай возможен только тогда, когда первичный ключ генерируется впервые, поскольку можно вставить запись без первичного ключа, но невозможно извлечь уже существующую запись из базы данных без первичного ключа.

Другие вопросы по теме