程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_450_0@如何解决使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int? 开发过程中遇到使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 Kotlin 在 Android Room 中将日期字符串迁移到 Int的解决方法建议,希望对你解决使用 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()
        }
    }
}

这是我迁移前的数据库:

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

@H_450_0@解决方法

因此,由于光标最初没有指向任何位置 (-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,请注明来意。