使用Kotlin在Android Room中将日期字符串迁移为Int

使用Kotlin在Android Room中将日期字符串迁移为Int,android,kotlin,android-room,database-migration,Android,Kotlin,Android Room,Database Migration,我需要在Android 9.0+上使用Kotlin 1.4.32中的Room 2.3迁移我的数据库。在我的初始数据库中,我的日期是一个字符串(即“2021-06-03T22:54:15.406-07:00[美国/洛杉矶]”),我希望在迁移期间将其迁移到和Int(即toepochssecond)。看起来我应该能够使用SupportSQLiteDatabase.query中的游标来迭代我的数据并进行转换,但是当我进行查询时,我的游标的计数为-1 这是我的迁移: val Migration_7_8 =

我需要在Android 9.0+上使用Kotlin 1.4.32中的Room 2.3迁移我的数据库。在我的初始数据库中,我的日期是一个字符串(即“2021-06-03T22:54:15.406-07:00[美国/洛杉矶]”),我希望在迁移期间将其迁移到和Int(即toepochssecond)。看起来我应该能够使用
SupportSQLiteDatabase.query
中的游标来迭代我的数据并进行转换,但是当我进行查询时,我的游标的计数为-1

这是我的迁移:

val Migration_7_8 = object : Migration(7, 8) {
    override fun migrate(database: SupportSQLiteDatabase)
    {
        database.execSQL("ALTER TABLE logEntryTable ADD COLUMN dateTime 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: ZonedDateTime = ZonedDateTime.parse(timeStr)

            val contentValues = ContentValues()
            contentValues.put("time", time.toEpochSecond())
            database.update("logEntryTable", SQLiteDatabase.CONFLICT_NONE, contentValues, "id=:id", arrayOf(id))

            cursor.moveToNext()
        }
    }
}
这是迁移前的我的数据库:

结果是(Zain在评论中也提到了这一点)唯一的问题是,在我的while循环中使用游标之前,我必须调用cursor.moveToNext()来初始化游标(即移动到第一行):

val Migration_7_8 = object : Migration(7, 8) {
    override fun migrate(database: SupportSQLiteDatabase)
    {
        database.execSQL("ALTER TABLE logEntryTable ADD COLUMN dateTime 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: ZonedDateTime = ZonedDateTime.parse(timeStr)

            val contentValues = ContentValues()
            contentValues.put("time", time.toEpochSecond())
            database.update("logEntryTable", SQLiteDatabase.CONFLICT_NONE, contentValues, "id=:id", arrayOf(id))

            cursor.moveToNext()
        }
    }
}
val Migration_7_8=对象:Migration(7,8){
覆盖乐趣迁移(数据库:SupportSQLiteDatabase)
{
execSQL(“ALTER TABLE logEntryTable ADD COLUMN dateTime INTEGER NOT NULL默认值0”)
execSQL(“ALTER TABLE logEntryTable将logEntryId列重命名为id”)
execSQL(“ALTER TABLE logEntryTable将logEntryAction列重命名为'action'”)
execSQL(“ALTER TABLE logEntryTable RENAME COLUMN logEntryTime TO time”)
execSQL(“altertablelogentrytable将logEntryLatitude列重命名为latitude”)
execSQL(“ALTER TABLE logEntryTable将LOGENTRYLONGITE列重命名为经度”)
val cursor=database.query(SimpleSQLiteQuery(“从logEntryTable中选择*))
val idColumnIndex=cursor.getColumnIndex(“id”)
val timeColumnIndex=cursor.getColumnIndex(“时间”)

所以,由于光标最初不指向任何位置(-1),所以在使用它之前,需要将其移动到某个有效位置


要将其移动到第一个位置,可以在while循环之前调用
moveToNext()

如果光标最初指向无位置(-1),则可以添加
cursor.moveToNext()
之前是的,谢谢。我正在试验,无意中发现了这一点。但为什么它还没有指向第一行。我看到你在20分钟前对此发表了评论。我直到现在才看到。我对stackoverflow有点陌生,忘了看评论部分,只是注意到了红色的数字。@Zain-请把你的a在答案部分回答,这样我可以相信你的答案。。。