我对作业有疑问。我的 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
所做的是:
在插入新行之前检查该行是否违反约束并且
-如果确实违反约束,它会删除现有行,然后插入新行
-if 它不违反约束,然后继续并插入新行
在您的表中,唯一存在的约束是:
id INTEGER PRIMARY KEY
除此之外别无其他。
这意味着无论何时您尝试插入新行:
-如果新的id
已经存在在表中,那么这个现有的行将被删除,新的行将被插入
- 如果新的 id
不存在 则将插入新行。
这是你想要的吗?
我想你想要的是对 2 列 (FAVCurrentLocationLAT,FAVCurrentLocationLONG)
的唯一性的约束,它应该是表中的 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
) 语句。
关于java - SQLite 如果数据库中存在输入则跳过或覆盖现有的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871387/