Android studio Android Studio-Kotlin-SQLite数据库是';t更改其中一个对应表的ID

Android studio Android Studio-Kotlin-SQLite数据库是';t更改其中一个对应表的ID,android-studio,kotlin,key,android-sqlite,Android Studio,Kotlin,Key,Android Sqlite,我正试图在Android应用程序中实现我的第一个SQLite数据库,以获取位置坐标来跟踪用户的位置 我正在尝试将条目中的信息添加到两个表中: 包含地名、id、纬度和经度信息的位置表 一种签入表,包含位置地址、相应位置的id(知道它对应的位置)、纬度、经度和签入时间等信息 无论何时尝试执行此操作,都不会更新Locations表的条目,只更新CheckIn表,尽管使用insert()函数插入Locations表,并且Location表的id也不会更新 我在一个调试器中检查了我的应用程序,但我不知

我正试图在Android应用程序中实现我的第一个SQLite数据库,以获取位置坐标来跟踪用户的位置

我正在尝试将条目中的信息添加到两个表中:

  • 包含地名、id、纬度和经度信息的位置表

  • 一种签入表,包含位置地址、相应位置的id(知道它对应的位置)、纬度、经度和签入时间等信息

无论何时尝试执行此操作,都不会更新Locations表的条目,只更新CheckIn表,尽管使用insert()函数插入Locations表,并且Location表的id也不会更新

我在一个调试器中检查了我的应用程序,但我不知道是什么导致了这个问题,因为没有错误,程序运行得很好,可以为签入表添加必要的信息

我已经尝试检查StackOverFlow,但是我找不到任何能够帮助解决我的问题的东西。如果有人能帮助我,我将不胜感激

我的添加功能:

    fun addLoc_CheckIn(Entry: Locations)
    {
    val selectQuery = "SELECT * FROM $LOCATIONS ORDER BY ID"
    val db = this.readableDatabase
    val cursor = db.rawQuery(selectQuery, null)

    var con = 0

    if (cursor.moveToFirst())
    {
        while (cursor.moveToNext())
        {
            val pSLong = cursor.getDouble(cursor.getColumnIndex(SLONG))
            val pCLong = cursor.getDouble(cursor.getColumnIndex(CLONG))
            val pSLat = cursor.getDouble(cursor.getColumnIndex(SLAT))
            val pCLat = cursor.getDouble(cursor.getColumnIndex(CLAT))
            val Theta = (pCLong * Entry.cLong) + (pSLong * Entry.sLong)

            var dist = (pSLat * Entry.sLat) + (pCLat * Entry.cLat * Theta)
            // dist = (Math.acos(dist) * 180.00 / Math.PI) * (60 * 1.1516 * 1.609344) / 1000
            dist = Math.acos(dist) * 6380000

            if (dist <= 30)
            {
                con = 1

                val db1 = this.writableDatabase
                val values = ContentValues()
                values.put(LOC_ID, cursor.getInt(cursor.getColumnIndex(ID)))
                values.put(ADDRESS, Entry.Checks[0].Address)
                values.put(LATI, Entry.Lat)
                values.put(LONGI, Entry.Long)
                values.put(TIME, Entry.Checks[0].Date_Time)
                db1.insert(CHECKINS, null, values)

                break
            }
        }
    }

    if (con == 0)
    {
        val db1 = this.writableDatabase
        val values = ContentValues()
        values.put(LOC_NAME, Entry.Name)
        values.put(LAT, Entry.Lat)
        values.put(LONG, Entry.Long)
        values.put(CLAT, Entry.cLat)
        values.put(SLAT, Entry.sLat)
        values.put(CLONG, Entry.cLong)
        values.put(SLONG, Entry.sLong)
        Entry.Id = db1.insert(LOCATIONS, null, values)

        val cvalues = ContentValues()
        cvalues.put(LOC_ID, Entry.Id)
        cvalues.put(ADDRESS, Entry.Checks[0].Address)
        cvalues.put(LATI, Entry.Lat)
        cvalues.put(LONGI, Entry.Long)
        cvalues.put(TIME, Entry.Checks[0].Date_Time)
        db1.insert(CHECKINS, null, cvalues)
    }
}

现在,在Location类和CheckIns类的构造函数中,我将id设置为-1,这是位置的id所保留的值,即使在使用insert()函数之后也是如此。现在,在添加我的签入以及增加我的签入表中的ID方面,这并没有给我带来任何问题,我怀疑这是否会导致问题,但我认为最好包含这些信息,以防万一。

我相信,由于使用

private val LOC_NAME = "LOC NAME"
列名不能有空格,除非按照使用特殊字符括起

当创建表时,这不是问题(列名为LOC)。但是,当您尝试插入时,将出现语法错误,该行将不会插入,但当您使用SQLiteDatabaseinsert方法时,错误将被捕获并继续处理

但是,在日志中,您会看到类似的内容:-

2019-10-29 15:47:35.119 12189-12189/aso.so58600930insert E/SQLiteLog: (1) near "NAME": syntax error
2019-10-29 15:47:35.121 12189-12189/aso.so58600930insert E/SQLiteDatabase: Error inserting LOC NAME=MyLoc LAT=100 CLAT=120 LONG=110 SLAT=140 CLONG=130 SLONG=150
    android.database.sqlite.SQLiteException: near "NAME": syntax error (code 1 SQLITE_ERROR): , while compiling: INSERT INTO LOCATIONS(LOC NAME,LAT,CLAT,LONG,SLAT,CLONG,SLONG) VALUES (?,?,?,?,?,?,?)
您可以使用以下方法绕过上述问题:-

        val db1 = this.writableDatabase
        val values = ContentValues()
        values.put("LOC", Entry.Name)
        values.put(LAT, Entry.Lat)
        values.put(LONG, Entry.Long)
        values.put(CLAT, Entry.cLat)
        values.put(SLAT, Entry.sLat)
        values.put(CLONG, Entry.cLong)
        values.put(SLONG, Entry.sLong)
        Entry.Id = db1.insert(LOCATIONS, null, values)
但是,不建议您使用上述名称,而是建议您更正名称,例如使用:-

private val LOC_NAME = "LOC_NAME" 
然后清除应用程序的数据或卸载应用程序,然后重新运行应用程序


此修复程序假定您正在开发应用程序,并且可以承受任何现有数据的丢失。您可以保留数据,但这有点复杂,因为您基本上必须使用适当的列名创建一个新表,从原始表复制数据,重命名或删除原始表,然后将新表重命名为原始名称。

噢,哇,说实话,非常感谢。它总是以那些你通常不会认为有什么大不了的事情而告终。这是我在想我的add函数会有问题
private val LOC_NAME = "LOC_NAME"