我的任务有一个问题。我的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
)语句。