Android Studio - Kotlin - SQLite Database 不会更改相应表之一的 ID



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

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

  • 一个位置表,包含地名、id、纬度和经度信息&

  • 一个签入表,包含地点地址、对应的location_id以知道它对应于哪个位置、纬度、经度和签入时间的信息。

每当我尝试这样做时,我的条目永远不会为Locations表更新,只会为CheckIn表更新,尽管使用insert((函数插入到Locations表中,id也不会为Location表更新。

我在调试器中查看了我的应用程序,但我不知道是什么原因导致了这里的问题,因为没有错误,而且程序运行良好,可以为签入表添加必要的信息。

我试过检查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)
}
}

My OnCreate函数和相应的配套对象:

companion object {
private val DATABASE_NAME = "LocationsDB"
private val DATABASE_VERSION = 1
// 1st Table - Unique Check Ins
private val LOCATIONS = "LOCATIONS"
private val ID = "ID"
private val LOC_NAME = "LOC NAME"
private val LAT = "LAT"
private val LONG = "LONG"
private val CLAT = "CLAT"
private val SLAT = "SLAT"
private val CLONG = "CLONG"
private val SLONG = "SLONG"
// 2nd Table - Repeated Check Ins
private val CHECKINS = "CHECKINS"
private val CHECKIN_ID = "CHECKIN_ID"
private val LOC_ID = "LOC_ID"
private val ADDRESS = "ADDRESS"
private val TIME = "TIME"
private val LATI = "LAT"
private val LONGI = "LONG"
}
override fun onCreate(p0: SQLiteDatabase?) {
val LOCATION_QUERY = "CREATE TABLE " + LOCATIONS + "(" + ID +
" INTEGER PRIMARY KEY AUTOINCREMENT, " + LOC_NAME +
" TEXT, " + LAT + " INTEGER, " + LONG + " INTEGER, " +
CLAT + " INTEGER, "+ SLAT + " INTEGER, " + CLONG + " INTEGER, "+ SLONG + " INTEGER " + ")"
val CHECKIN_QUERY = "CREATE TABLE " + CHECKINS + "(" +
LOC_ID + " INTEGER, " + CHECKIN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LATI + " INTEGER, " + LONGI + " INTEGER, " + ADDRESS +
" TEXT, " + TIME + " TEXT " + ")"
p0!!.execSQL(LOCATION_QUERY)
p0.execSQL(CHECKIN_QUERY)
}

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

我认为由于使用,您对列的名称有问题

private val LOC_NAME = "LOC NAME"

列名不能有空格,除非按照SQLite理解的SQL-SQLite关键字用特殊字符括起来。

创建表时这不是问题(列名将为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" 

然后清除应用程序的数据或卸载应用程序,然后重新运行应用程序。

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

最新更新