База данных комнат Android: функция автоматической привязки() выдает ошибку несовместимых типов

#java #android #kotlin

Вопрос:

Я работаю над базой данных комнат для Android. У меня не слишком большой опыт в этом, поэтому я следовал некоторым руководствам по этому вопросу, пытаясь адаптировать его к тому, для чего он мне нужен. При сборке я получаю следующую ошибку: error: incomparable types: boolean and <null> _tmp = _tmp_1 == null ? null : (_tmp_1 ? 1 : 0); из файла Dao Impl, который автоматически генерируется.

Сгенерированный код, который выдает эту ошибку, является:

 @Override
public void bind(SupportSQLiteStatement stmt, Product value) {
  final Integer _tmp;
  final boolean _tmp_1;
  _tmp_1 = value.getId() != 0;
  _tmp = _tmp_1 == null ? null : (_tmp_1 ? 1 : 0);
 

Эта же самая ошибка присутствует во всех реализациях Dao, поэтому я не уверен, в чем здесь проблема.

У меня есть три Дао, это код для них:

 import androidx.lifecycle.LiveData
import androidx.room.*

@Dao
interface ProductDao {
    @Query("SELECT * FROM product_table")
    fun getAll(): List<Product>
    @Transaction
    @Query("SELECT * FROM product_table WHERE id = :id LIMIT 1")
    fun getProductById(id: Int): Product
    @Transaction
    @Query("SELECT * FROM product_table WHERE name LIKE :name")
    fun getProductByName(name: String): Product
    @Query("SELECT id FROM product_table WHERE name LIKE :name")
    fun getId(name: String): Int
    @Transaction
    @Insert(entity = Product::class)
    suspend fun insert(product: Product)
    @Transaction
    @Delete
    suspend fun drop(product: Product)
    @Query("DELETE FROM product_table")
    suspend fun dropAll()
}
 
 import androidx.room.*

@Dao
interface ReportDao {
    @Query("SELECT * FROM report_table WHERE reportId = :reportId LIMIT 1")
    fun getReport(reportId: Int): Report
    @Insert
    suspend fun insert(report: Report)
    @Delete
    suspend fun drop(report: Report)
}
 
 import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query

@Dao
interface UserDao {
    @Query("SELECT * FROM user_table WHERE id = :id LIMIT 1")
    fun getUserById(id: Int): User
    @Insert
    suspend fun insert(user: User)
    @Delete
    suspend fun drop(user: User)
}
 

Ошибка поступает из сгенерированного конструктора в класс реализации:

 this.__insertionAdapterOfProduct = new EntityInsertionAdapter<Product>(__db) {
  @Override
  public String createQuery() {
    return "INSERT OR ABORT INTO `product_table` (`id`,`name`,`parts`) VALUES (nullif(?, 0),?,?)";
  }

  @Override
  public void bind(SupportSQLiteStatement stmt, Product value) {
    final Integer _tmp;
    final boolean _tmp_1;
    _tmp_1 = value.getId() != 0;
    _tmp = _tmp_1 == null ? null : (_tmp_1 ? 1 : 0);
    if (_tmp == null) {
      stmt.bindNull(1);
    } else {
      stmt.bindLong(1, _tmp);
    }
    if (value.getName() == null) {
      stmt.bindNull(2);
    } else {
      stmt.bindString(2, value.getName());
    }
    final String _tmp_2;
    _tmp_2 = __dataConverter().fromStringList(value.getParts());
    if (_tmp_2 == null) {
      stmt.bindNull(3);
    } else {
      stmt.bindString(3, _tmp_2);
    }
  }
};
 

Комментарии:

1. Я вижу в вашем коде примитив типа переменной _tmp_1, поэтому он не может быть нулевым. Я предлагаю вам удалить эту ненужную часть из вашего кода _tmp_1 == null ? null :

2. Наверное, я не слишком ясно выразился по этому поводу, код, который выдает ошибку, генерируется автоматически, поэтому я ничего не могу изменить в коде, иначе бы я это сделал.

3. Можете ли вы также предоставить свои классы, пожалуйста, если ваша проблема все еще актуальна