当前位置: 首页 > 知识库问答 >
问题:

使用静态编程语言在Android房间中将日期字符串迁移到Int

路扬
2023-03-14

我需要在Android 9.0上使用静态编程语言1.4.32中的Room 2.3迁移我的数据库。在我的初始数据库中,我的日期是一个字符串(即“2021-06-03T22:54:15.406-07:00[America/Los_Angeles]”),我想在迁移期间将其迁移到和Int(即toEpochII)。看来我应该能够使用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()
        }
    }
}

共有2个答案

祁远
2023-03-14

所以,当光标最初指向无位置(-1)时,您需要在使用它之前将其移动到某个有效位置

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

岳昊空
2023-03-14

结果证明(Zain在评论中也提到)唯一的问题是我必须调用游标。moveToNext()显然是为了在while循环中使用光标之前初始化光标(即移动到第一行):

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()
        }
    }
}
 类似资料:
  • 我有这个日期“08/08/2019”,我希望它看起来像这样:“08, Aug 2019”,我试着在时使用

  • 如何发布原始jsonArray字符串在kotlin使用改造 我在onFailure方法上有超时响应 这是我想发布的字符串数组示例 [{"username":"username4"},{"username":"username2"}] 这是我的endpoint定义 这是我的课程 这是我的发帖方法 var obj=JSONObject();var arr=JSONArray(); 这里是使用邮递员的成

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我们的应用程序有DB14版本,并使用android sqllite帮助器。现在我们正在使用房间数据库,并将所有数据库的东西迁移到房间。我们已经定义了从1_2,2_3的所有迁移。到13_14,并给出所有这些int构建 这是正确的做法吗。如果我用DB14版本安装了非房间版本的应用程序,并且我试图用相同的DB14版本更新它到房间版本的应用程序,我会得到错误: IllegalStateException:

  • 我当前的项目使用Kotlin序列化来使用一系列远程RESTFul API。 API响应是Json,我无法修改它们。 其中一个API将“Person”作为字符串或字符串数组返回。 我如何让Kotlin序列化自动消耗任何一个值? 我使用这个版本的静态编程语言序列化