我的任务有一个问题。我的Android应用程序中有一个带有sqlite的数据库,位置更新来了,并写入了sql db,但是即将更新有一些相同的数据。我想检查数据库中是否存在相同的位置,系统会跳过或覆盖数据库中现有的位置信息,如x,y。替换或类似的东西,我的数据库中也有ID。

如何更改和组织我的工作代码?

public void DBCreate(){
    SQLITEDATABASE = openOrCreateDatabase("LatLongDatabase3", Context.MODE_PRIVATE, null);
    SQLITEDATABASE.execSQL("CREATE TABLE IF NOT EXISTS myTable74(id INTEGER PRIMARY KEY AUTOINCREMENT, FAVCurrentLocationLAT VARCHAR,FAVCurrentLocationLONG VARCHAR);");
}

public void SubmitData2SQLiteDB(){
    SQLiteQuery = "INSERT OR REPLACE INTO myTable74(id, FAVCurrentLocationLAT, FAVCurrentLocationLONG) VALUES(NULL,'"+mCurrentLocation.getLatitude()+"','"+mCurrentLocation.getLongitude()+"');";
    SQLITEDATABASE.execSQL(SQLiteQuery);
    Toast.makeText(CampaignActivity.this,"OK", Toast.LENGTH_LONG).show();
}

最佳答案

您不像应该那样使用INSERT OR REPLACE
INSERT OR REPLACE或简单地REPLACE的作用是:
在插入新行之前检查该行是否违反约束,并且
-如果确实违反约束,它将删除现有行,然后插入新行
-如果不违反约束,则继续并插入新行
在表中,唯一存在的约束是:

id INTEGER PRIMARY KEY


没什么
这意味着您每次尝试插入新行时:
-如果表中已经存在新的id,则此现有行将被删除并插入新行
-如果新的id不存在,则将插入新行。
这是你想要的吗?
我认为您想要的是对表中(FAVCurrentLocationLAT,FAVCurrentLocationLONG)的2列PRIMARY KEY的唯一性的约束,因为我认为不需要id(或者也许是必需的,但是不是插入失败的原因)。
因此,将表的CREATE语句更改为此:

CREATE TABLE myTable74 (
  FAVCurrentLocationLAT TEXT,
  FAVCurrentLocationLONG TEXT,
  PRIMARY KEY(FAVCurrentLocationLAT,FAVCurrentLocationLONG)
);


现在,每次执行语句时:

SQLiteQuery =
  "INSERT OR REPLACE INTO myTable74(FAVCurrentLocationLAT, FAVCurrentLocationLONG) " +
  "VALUES('"+mCurrentLocation.getLatitude()+"','"+mCurrentLocation.getLongitude()+"');";


新的值对将被插入,而现有的将被替换。
当然不需要替换,因此您可以仅通过代码检查表中是否已存在值,以及它们是否确实不执行INSERT(而不是REPLACE)语句。

08-18 14:35
查看更多