SQLite INSERT OR REPLACE仅插入且永不替换

时间:2016-12-22 17:31:56

标签: android sqlite insert sql-update android-sqlite

我的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" +
            ");");

1 个答案:

答案 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]