#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. Можете ли вы также предоставить свои классы, пожалуйста, если ваша проблема все еще актуальна