我的INSERT OR REPLACE查询似乎不起作用。它只向数据库插入值,但从不更新。我希望它检查日期,如果找到相同的日期,它只会更新值而不会插入新行。
这是我的问题:
Set<Map.Entry<String, Object>> s=contentValues.valueSet();
Iterator itr = s.iterator();
String[] valuesArray;
List<String> valuesList = new ArrayList<String>();
while(itr.hasNext())
{
Map.Entry me = (Map.Entry)itr.next();
Object value = me.getValue();
valuesList.add(String.valueOf(value));
}
valuesArray = valuesList.toArray(new String[valuesList.size()]);
Date unformatedDate = new Date(valuesArray[2]);
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String formatedDate = DATE_FORMAT.format(unformatedDate);
valuesArray[2] = formatedDate;
db.execSQL("INSERT OR REPLACE INTO history (_id, totalElevation, datetime, totaldistance, averageSpeed) VALUES ((SELECT _id FROM history WHERE datetime = ?),?,?,?,?)", valuesArray);
这是我的表结构:
sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS history (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"datetime DATE, " +
"totaldistance DOUBLE, " +
"totalElevation DOUBLE," +
"averageSpeed DOUBLE" +
");");
答案 0 :(得分:1)
您将日期传递给错误的占位符第三个(valuesArray[2]
),而不是第一个(valuesArray[0]
)。
参数位置 查询或命令中的位置与数组中的位置之间存在1:1关系(哪些索引从 0 开始)。
您的SQL命令(同样,它不是查询 - 查询只有SELECT
)将被解析为:
INSERT OR REPLACE INTO history (_id, totalElevation, datetime, totaldistance, averageSpeed) VALUES
((SELECT _id FROM history WHERE datetime = A), B, '2016-12-23', C, D)
其中A在valuesArray [0]中,B在valuesArray [1],&#39; 2016-12-23&#39;在valuesArray [2]中,C在valuesArray [3]中,D在valuesArray中[4]
虽然您需要一个如下所示的命令:
INSERT OR REPLACE INTO history (_id, totalElevation, datetime, totaldistance, averageSpeed) VALUES
((SELECT _id FROM history WHERE datetime = '2016-12-23'), A, B, C, D)
2016-12-23&#39;在valuesArray [0]中,A在valuesArray [1]中,B在valuesArray [2]中,C在valuesArray [3]中,D在valuesArray中[4]