【问题标题】:Android Room force rewrite property by autoincrement valueAndroid Room 通过自动增量值强制重写属性
【发布时间】:2020-09-12 09:56:46
【问题描述】:

我有一个标准的长字段

 @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 中的自动增量值?

我从存储库 livedata 接收数据。在视图模型中

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)
    }
}

【问题讨论】:

  • 贴出调用插入的代码。
  • @Insert(onConflict = OnConflictStrategy.REPLACE) 有趣的插入(i:MyTypeObject)
  • 不是DAO,“但它是在过程中填充的”..这个
  • 我更新了问题。我使用的底部方法
  • OK 在dao.insert(book)之前设置id为0

标签: android kotlin dao


【解决方案1】:

感谢大家的帮助。通过官方文档“如果字段类型是 long 或 int(或其 TypeConverter 将其转换为 long 或 int),则 Insert 方法在插入项目时将 0 视为未设置。”您必须将 0 添加到具有自动增量的 id 字段。

我的问题也是对数据库数据文件的访问不正确。我在 Android stuidi® 上使用“设备文件资源管理器”,在右键菜单上使用“另存为”。 SQL数据调试的错误方法。正确访问其 adb 终端 shell 的数据。比如我的操作系统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

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2015-07-11
    相关资源
    最近更新 更多