【问题标题】:SQLite INSERT OR REPLACE only inserts and never replacesSQLite INSERT OR REPLACE 只插入,从不替换
【发布时间】:2016-12-22 17:31:55
【问题描述】:

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

【问题讨论】:

  • sqlite 对不起......它在标题中
  • 子查询中使用的实际日期值是多少?是否存在于数据库中?
  • 你需要使日期时间唯一

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


【解决方案1】:

您将日期传递给错误的占位符 第三个 (valuesArray[2]),而不是第一个 (valuesArray[0])。

参数是位置
查询或命令中的位置与数组中的位置(索引从 0 开始)之间存在 1:1 的关系。

您的 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] 中,'2016-12-23' 在 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' 在 valuesArray[0] 中,A 在 valuesArray[1] 中,B 在 valuesArray[2] 中,C 在 valuesArray[3] 中,D 在 valuesArray[4]

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 2010-09-29
    • 2015-03-26
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多