Миграция комнаты. Как добавить новый столбец NON-NULL и строкового типа в существующую таблицу.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Гость
 Миграция комнаты. Как добавить новый столбец NON-NULL и строкового типа в существующую таблицу.

Сообщение Гость »


Я разрабатываю приложение для Android, и в своем приложении я реализовал базу данных комнат. Мое приложение уже доступно в магазине PlayStore, так как теперь я пытаюсь отправить обновление приложения, в схеме которого есть изменения. Я добавил новый столбец, его тип — строка, и он не должен быть NULL, поэтому я предоставлю ему значение по умолчанию.

Я написал для этого запрос на миграцию, но приложение всегда вылетает.

Вопрос: почему ожидается столбец modifyDate notNull=false, но я хочу, чтобы он был НЕ NULL. Я не вижу никакой разницы в ожидаемых и найденных частях, ожидаю статус и значение notNull

Мне не удалось найти истинную причину этого сбоя.

Ниже мой код:

Класс сущности

@Keep @Сущность класс PdfFile() { //Столбцы перед миграцией @PrimaryKey(autoGenerate = true) частная переменная Mid = 0 частная переменная mFile_name: String? = ноль частный var mFile_size = "0 МБ" частный var mFileDate = "17-06-2020" частный var mParent_file = "" частная переменная mAbsolute_path: строка? = ноль частный var fileType = "" частная переменная isViewed = false частная вар isBookmarked = false //ТЕСТОВАЯ МИГРАЦИЯ @ColumnInfo(name = «modifyDate») частный var ModifyDate = "" весело setMid(mid: Int) { this.mid = середина } весело getMid(): Int { вернуться в середине } весело getMFile_name(): Строка? { вернуть mFile_name } весело getMFile_size(): String { вернуть mFile_size } весело getMFileDate(): String { вернуть mFileDate } весело getMParent_file(): String { вернуть mParent_file } весело getMAbsolute_path(): Строка? { вернуть mабсолютный_путь } весело getFileType(): String { вернуть тип файла } весело getIsViewed(): Boolean { возврат isViewed } весело getIsBookmarked(): Boolean { возврат isBookmarked } весело getModifyDate(): String { вернуть дату изменения } весело setMFile_name (имя: String) { this.mFile_name = имя } весело setMFile_size (размер: String) { this.mFile_size = размер } весело setMFileDate (дата: String) { this.mFileDate = дата } весело setMParent_file (parentFile: String) { this.mParent_file = родительский файл } весело setMAbsolute_path (путь: строка) { this.mAbsolute_path = путь } весело setFileType (fileType: String) { this.fileType = Тип файла } весело setIsViewed(isView: Boolean) { this.isViewed = isView } весело setIsBookmarked(isBookmark: Boolean) { this.isBookmarked = isBookmark } весело setModifyDate (дата: String) { this.modifyDate = дата } переопределить удовольствие равно(obj: Any?): Boolean { return if (obj !is PdfFile) { ЛОЖЬ } еще { val PdfFile = obj как PdfFile mFile_name == PdfFile.getMFile_name() && mAbsolute_path == PdfFile.getMAbsolute_path() && mFile_size == PdfFile.getMFile_size() } } } Класс базы данных комнат

//Обратите внимание, что предыдущая версия была 1, теперь я изменил ее на 2 после добавления нового столбца в объект @База данных( сущности = [PdfFile::class], версия = 2, экспортная схема = ложь ) абстрактный класс RoomDbData : RoomDatabase() { абстрактное развлечение TaskDao(): DataDao } Класс DatabaseManager

const val DATABASE_NAME = «MyDb» класс DatabaseManager (контекст: Контекст) { //Мигрируем с версии 1 на версию 2 val MIGRATION_1_2 = объект: Миграция(1, 2) { переопределить забавную миграцию (база данных: SupportSQLiteDatabase) { data.execSQL("ALTER TABLE PdfFile ADD COLUMNmodifyDate TEXT NOT NULL DEFAULT ''") } } вал appDatabase: RoomDbData в этом { база данных приложения = Room.databaseBuilder(контекст, RoomDbData::class.java, DATABASE_NAME) .allowMainThreadQueries() .addMigrations(MIGRATION_1_2) .строить() } } ИСКЛЮЧЕНИЕ

Процесс: имя_пакета, PID: 10993 java.lang.RuntimeException: Исключение при вычислении текущих данных базы данных. в androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:92) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) в java.lang.Thread.run(Thread.java:764) Вызвано: java.lang.IllegalStateException: миграция не выполнена должным образом: PdfFile(mypackagename.models.entities.PdfFile). Ожидал: TableInfo {name = 'PdfFile', columns = {isBookmarked = Column {name = 'isBookmarked', type = 'INTEGER', affinity = '3', notNull = true, PrimaryKeyPosition = 0, defaultValue = 'null'}, ModifyDate = Column {name = 'modifyDate', type = 'TEXT', affinity = '2', notNull = false, PrimaryKeyPosition = 0, defaultValue = 'null'}, mFile_size = Column {name = 'mFile_size', type = 'TEXT' , affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, Mid=Column{name='mid', type='INTEGER', affinity='3', notNull=true, PrimaryKeyPosition= 1, defaultValue = 'null'}, mFileDate = Column {name = 'mFileDate', type = 'TEXT', affinity = '2', notNull = false, PrimaryKeyPosition = 0, defaultValue = 'null'}, mAbsolute_path = Column { name='mAbsolute_path', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, mParent_file=Column{name='mParent_file', type='TEXT', affinity ='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, mFile_name=Column{name='mFile_name', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, fileType=Column{name='fileType', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, isViewed=Column{name= 'isViewed', type='INTEGER', affinity='3', notNull=true, PrimaryKeyPosition=0, defaultValue='null'}}, ForeignKeys=[], index=[]} Найденный: TableInfo {name = 'PdfFile', columns = {isBookmarked = Column {name = 'isBookmarked', type = 'INTEGER', affinity = '3', notNull = true, PrimaryKeyPosition = 0, defaultValue = 'null'}, ModifyDate = Column {name = 'modifyDate', type = 'TEXT', affinity = '2', notNull = true, PrimaryKeyPosition = 0, defaultValue = ''''}, mFile_size = Column {name = 'mFile_size', type = 'TEXT ', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, Mid=Column{name='mid', type='INTEGER', affinity='3', notNull=true, PrimaryKeyPosition =1, defaultValue='null'}, mFileDate=Column{name='mFileDate', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, mAbsolute_path=Column {name='mAbsolute_path', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, mParent_file=Column{name='mParent_file', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, mFile_name=Column{name='mFile_name', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0 , defaultValue='null'}, fileType=Column{name='fileType', type='TEXT', affinity='2', notNull=false, PrimaryKeyPosition=0, defaultValue='null'}, isViewed=Column{name ='isViewed', type='INTEGER', affinity='3', notNull=true, PrimaryKeyPosition=0, defaultValue='null'}}, ForeignKeys=[], indexes=[]} в androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:124) в android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:299) в android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:92) в androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:53) в androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476) в androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281) 2020-10-20 15:14:41.031 10993-11039/mypackagename E/AndroidRuntime: в androidx.room.RoomDatabase.query(RoomDatabase.java:324) в androidx.room.util.DBUtil.query(DBUtil.java:83) по адресу mypackagename.models.dao.DataDao_Impl$13.call(DataDao_Impl.java:325) по адресу mypackagename.models.dao.DataDao_Impl$13.call(DataDao_Impl.java:322) в androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:90) ... еще 3 20.10.2020 15:14:41.064 1764-1833/? E/InputDispatcher: канал 'f088a5d mypackagename/mypackagename.views.activities.MainActivity (server)' ~ Канал необратимо поврежден и будет удален! 20.10.2020 15:14:41.067 1764-1833/? E/InputDispatcher: канал '1aca3d4 mypackagename/mypackagename.views.activities.SplashActivity (server)' ~ Канал безвозвратно поврежден и будет удален! 2020-10-20 15:14:41.110 1764-4588/? E/eglCodecCommon: glUtilsParamSize: неизвестный параметр 0x00008cdf 2020-10-20 15:14:41.111 1764-4588/? E/eglCodecCommon: glUtilsParamSize: неизвестный параметр 0x00008cdf 2020-10-20 15:14:41.111 1764-4588/? E/eglCodecCommon: glUtilsParamSize: неизвестный параметр 0x00008824 2020-10-20 15:14:41.111 1764-4588/? E/eglCodecCommon: glUtilsParamSize: неизвестный параметр 0x00008824 20.10.2020 15:14:41.233 1541-4743/? E/AudioFlinger: недостаточно памяти для AudioTrack, размер = 131296 20.10.2020 15:14:41.233 1541-4743/? E/AudioFlinger: createRecordTrack_l() initCheck не удалось -12; нет блока управления? 20.10.2020 15:14:41.233 2486-7131/? E/AudioRecord: AudioFlinger не удалось создать дорожку записи, статус: -12 2020-10-20 15:14:41.236 2486-7131/? E/AudioRecord-JNI: Ошибка создания экземпляра AudioRecord: проверка инициализации не удалась со статусом -12. 2020-10-20 15:14:41.236 2486-7131/? E/android.media.AudioRecord: код ошибки -20 при инициализации собственного объекта AudioRecord. 20.10.2020 15:14:41.237 2486-7131/? E/ActivityThread: не удалось найти информацию о поставщике для ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, ЧТО Я НЕ ВНЕСИЛ НИКАКИХ ИЗМЕНЕНИЙ В DAO ДЛЯ ЭТОЙ МИГРАЦИИ. Там тоже требуются какие-то изменения?

Может кто-нибудь помочь мне с этим. Любая помощь будет оценена по достоинству. Спасибо
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»