Android Свойство принудительной перезаписи помещения по значению автоинкремента - PullRequest
1 голос

У меня есть стандартное длинное поле

 @PrimaryKey(autoGenerate = true)
 val id:Long

Но оно заполняется в процессе и имеет случайное значение. Если я попытаюсь добавить его в базу данных через DAO, тогда id не будет перезаписан механизмом autoGenerate sqlite

 @Insert(onConflict = OnConflictStrategy.REPLACE)
 fun insert(i:MyTypeObject)

Если я сделаю это поле типа обнуляемым, оно тоже не будет работать

 @PrimaryKey(autoGenerate = true)
 val id:Long?

Существует способ принудительного преобразования любого значения в поле id в значение автоинкремента в db?

Я получаю данные из репозитория liveata. В представлении модель

private val db = CurrencyDatabase.getInstance(getApplication())
private val dao = db!!.nalDao()
private val service = Executors.newFixedThreadPool(1)

  fun addBook(book: CurrencyItem)
{
    service.submit {
        dao.insert(book)
    }
}

1 Ответ

1 голос

Спасибо всем за помощь. Согласно официальной документации: «Если тип поля long или int (или его TypeConverter преобразует его в long или int), методы Insert обрабатывают 0 как не установленное при вставке элемента». Вы должны добавить 0 в поле id с автоинкрементом.

Также моей проблемой был неправильный доступ к файлу данных базы данных. Я использую «Проводник файлов устройства» в Android stuidiо и «Сохранить как» в меню, вызываемом правой кнопкой мыши. Это неправильный способ отладки SQL данных. Правильный доступ к данным своей терминальной оболочки adb. Например, моя ОС Win10 и имя файла базы данных = book.db и datatable = nal

Открытый терминал

cd %USERPROFILE%\AppData\Local\Android\sdk\platform-tools
adb root
adb devices

Мое устройство было «emulator-5554», затем

adb -s emulator-5554 shell
sqlite3

Внутри оболочки sqlite

.open /data/data/com.example.scotland/databases/book.db
select * from nal;

Если вы не можете найти файл базы данных. Попробуйте открыть

View->ToolWindows->Device File explorer.

Там дерево файловой системы ADB. Вы должны открыть

data->data->YouProjectName->databases
...