ошибка: проблема с запросом: [SQLITE_ERROR] ошибка SQL или отсутствует база данных (нет такого столбца: isFinished)

#android #database #kotlin #android-room #rx-java2

#Android #База данных #kotlin #android-комната #rx-java2

Вопрос:

Используя Room RxJava, я хочу добавить дополнительный столбец в таблицу моей базы данных «история», но не в самой базе данных, поэтому я использую «@Transient», который работает как «@Ignore».

Также у меня есть 2 модели данных и 2 «Dao», обращающиеся к БД. Модель данных «словарь» работает нормально после добавления:

 @Transient
var status: Int? = 0
  

но когда я хочу добавить еще один столбец в мою вторую «историю» модели данных, например:

 @Transient
var isFinished: Int? = 0
  

это выдает мне эту ошибку:

ошибка: проблема с запросом: [SQLITE_ERROR] ошибка SQL или отсутствует база данных (нет такого столбца: isFinished)

Вот модели данных:

 import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey


@Entity(tableName = "vocabulary")
data class  Vocabulary constructor(

@PrimaryKey
val id: Int?,
val range: String?,
val note: String?,
val word: String?,
val coding: String?,
val pronunciation: String?,
val examples: String?,
val lesson: Int?,
val lesson_order: Int?,
val definition: String?,
val persian: String?,
var favorited: Int?,
val viewed: Int?,
val is_read: Int?,
val pexa: String?,
val pexb: String?,
val pexc: String?
){
    @Transient
    var status: Int? = 0
}
  

вторая модель данных:

 import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey


@Entity(tableName = "story")
data class Story(

    @PrimaryKey
    val id: Int?,
    val title: String?,
    val text: String?,
    val per_title: String?,
    val per_text: String?,
    val range: String?

){
    @Transient
    var isFinished: Int? = 0
}
  

и в Dao я использую его следующим образом:

 @Dao
interface IStoryDao {

    @Query("UPDATE story SET isFinished = 1 ")
    fun setFinished(): Completable
}
  

Ответ №1:

Но чего вы ожидаете?

@Transient like @Ignore позволяет добавлять поле в класс объекта без добавления соответствующего столбца в базу данных Sqlite. Это означает, что вы не можете использовать такие поля в запросах, и сообщение об ошибке сообщает именно об этом:

нет такого столбца: isFinished

Может быть, у вас какое-то недопонимание ниже?

Я хочу добавить дополнительный столбец в свою таблицу базы данных «история», но не в фактическую базу данных

При @Transient этом вы просто добавляете поле в класс данных Kotlin, и это поле не сохраняется в базе данных. Я думаю, у вас нет проблем с status полем, просто потому, что вы не используете с ним запрос.

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

1. спасибо за ваш ответ! теперь все стало намного понятнее! теперь я вижу, как я неправильно его использовал! спасибо, чувак