#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. спасибо за ваш ответ! теперь все стало намного понятнее! теперь я вижу, как я неправильно его использовал! спасибо, чувак