大佬教程收集整理的这篇文章主要介绍了使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在 AndroID 9.0+ 上的 Kotlin 1.4.32 中使用 Room 2.3 迁移我的数据库。在我的初始数据库中,我的日期是一个字符串(即 "2021-06-03T22:54:15.406-07:00[America/Los_Angeles]"),我想将它迁移到 Int(即toEpochSecond)在迁移期间。看来我应该能够使用 SupportsqliteDatabase.query
中的 cursor 来遍历我的数据并进行转换,但是当我执行 query 时,我的 cursor 计数为 -1。
这是我的迁移:
val Migration_7_8 = object : Migration(7,8) {
overrIDe fun migrate(database: SupportsqliteDatabasE)
{
database.execsql("alter table logEntrytable ADD columN datetiR_395_11845@e IntegeR NOT NulL DEFAulT 0" )
database.execsql("alter table logEntrytable Rename columN logEntryID TO ID")
database.execsql("alter table logEntrytable Rename columN logEntryAction TO 'action'")
database.execsql("alter table logEntrytable Rename columN logEntryTime TO time")
database.execsql("alter table logEntrytable Rename columN logEntryLatitude TO latitude")
database.execsql("alter table logEntrytable Rename columN logEntryLongitude TO longitude")
val cursor = database.query(Simplesqlitequery("SELECT * FROM logEntrytable"))
val IDcolumnIndex = cursor.getcolumnIndex("ID")
val timecolumnIndex = cursor.getcolumnIndex("time")
while(!cursor.isAfterLast)
{
val timestr = cursor.getString(3)
val ID = cursor.geTint(IDcolumnIndeX)
val time: zoneddatetiR_395_11845@e = zoneddatetiR_395_11845@e.parse(timestr)
val contentValues = ContentValues()
contentValues.put("time",time.toEpochSecond())
database.update("logEntrytable",sqliteDatabase.CONFliCT_NONE,contentValues,"ID=:ID",arrayOf(ID))
cursor.movetoNext()
}
}
}
这是我迁移前的数据库:
因此,由于光标最初没有指向任何位置 (-1),因此您需要在使用之前将其移动到某个有效位置
要将其移动到第一个位置,您可以在 while 循环之前调用 @H_173_5@moveToNext()
,所以结果证明(正如 Zain 在评论中所指出的)唯一的问题是我必须调用 cursor.moveToNext() 显然是为了初始化游标(即移动到第一行)在使用它之前我的while循环:
val Migration_7_8 = object : Migration(7,8) {
override fun migrate(database: SupportsqliteDatabasE)
{
database.execSQL("alter table logEntryTable ADD columN datetiR_395_11845@e IntegeR NOT NULL DEFAULT 0" )
database.execSQL("alter table logEntryTable Rename columN logEntryId TO id")
database.execSQL("alter table logEntryTable Rename columN logEntryAction TO 'action'")
database.execSQL("alter table logEntryTable Rename columN logEntryTime TO time")
database.execSQL("alter table logEntryTable Rename columN logEntryLatitude TO latitude")
database.execSQL("alter table logEntryTable Rename columN logEntryLongitude TO longitude")
val cursor = database.query(SimplesqliteQuery("SELECT * FROM logEntryTable"))
val idcolumnIndex = cursor.getcolumnIndex("id")
val timecolumnIndex = cursor.getcolumnIndex("time")
cursor.moveToNext() // <====================== HERE
while(!cursor.isAfterLast)
{
val timestr = cursor.getString(3)
val id = cursor.geTint(idcolumnIndeX)
val time: ZoneddatetiR_395_11845@e = ZoneddatetiR_395_11845@e.parse(timestr)
val contentValues = ContentValues()
contentValues.put("time",time.toEpochSecond())
database.update("logEntryTable",sqliteDatabase.CONFLICT_NONE,contentValues,"id=:id",arrayOf(id))
cursor.moveToNext()
}
}
}
以上是大佬教程为你收集整理的使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int全部内容,希望文章能够帮你解决使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。