Комната DAO не может получить данные из базы данных - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть таблица «Контакты» и таблица «Номера телефонов». Таблица с телефонными номерами содержит строку, которая указывает на автоматически сгенерированный идентификатор контакта. Я пытаюсь получить все телефонные номера, связанные с этим контактом в моем PhoneNumbersDao, как показано ниже:

@Dao
public interface PhoneNumberDao {

    @Insert
    void insert(PhoneNumber phoneNumber);

    @Update
    void update(PhoneNumber phoneNumber);

    @Delete
    void delete(PhoneNumber phoneNumber);


    // Retrieve entry/entries by contact ID
    @Query("SELECT * FROM phone_numbers_table WHERE contact_id =:contactId")
    LiveData<List<PhoneNumber>> getPhoneNumbersById(long contactId);
}

Мой класс PhoneNumber:

@Entity(tableName = "phone_numbers_table")
public class PhoneNumber implements Serializable {

    @PrimaryKey(autoGenerate = true)
    public int id;
    /** String resource ID for the phone number */
    @SerializedName("phone_number")
    public String mPhoneNumber;
    /** String resource ID for the phone number type */
    @SerializedName("phone_number_type")
    public String mPhoneNumberType;
    /** String resource ID for the respective contact ID */
    @SerializedName("contact_id")
    @ColumnInfo(name = "contact_id")
    public int contactId;

    public PhoneNumber(String phoneNumber, String phoneNumberType, int contactId) {
        this.mPhoneNumber = phoneNumber;
        this.mPhoneNumberType = phoneNumberType;
        this.contactId = contactId;
    }

    public int getId() {
        return id;
    }

    public String getPhoneNumber() {
        return mPhoneNumber;
    }

    public String getPhoneNumberType() {
        return mPhoneNumberType;
    }

    public int getContactId() {
        return contactId;
    }
}

И, наконец, я пытаюсь получить доступ к базе данных, используя этот метод в PhoneNumberRepository:

public LiveData<List<PhoneNumber>> getPhoneNumbersByContactId(long id) {
        return phoneNumberDao.getPhoneNumbersById(id);
    }

Но метод все еще возвращает ноль. Почему это может быть так?

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

В вашем классе PhoneNumber должно быть два конструктора: один принимает идентификатор, а другой - без аннотации игнорирования. Возможно, именно поэтому данные не сохраняются в вашей базе данных. Таким образом, ваш код должен быть похож на

@Ignore
 public PhoneNumber(String phoneNumber, String phoneNumberType, int contactId) {
    this.mPhoneNumber = phoneNumber;
    this.mPhoneNumberType = phoneNumberType;
    this.contactId = contactId;
}

 public PhoneNumber(int id, String phoneNumber, String phoneNumberType, int contactId) {
    this.id = id;
    this.mPhoneNumber = phoneNumber;
    this.mPhoneNumberType = phoneNumberType;
    this.contactId = contactId;
}
0 голосов
/ 13 апреля 2020

Комната требуется по умолчанию конструктор. Так что создайте конструктор по умолчанию в вашей сущности.

 public PhoneNumber() {
 }
0 голосов
/ 13 апреля 2020

Добавьте этого наблюдателя в свой Фрагмент или Активность . Через этого наблюдателя вы сможете получать данные из базы данных, если у вас есть данные в базе данных, в противном случае вы получите * 1005. * ноль

 viewModel.getPhoneNumbersByContactId(contactId).observe(this, new Observer<List<PhoneNumber>>() {
      @Override
      public void onChanged(@Nullable List<PhoneNumber> phoneList) {
//Here you will get all your phone list if you have any in database else you will get null
      }
  });
...