【问题标题】:Android insert into sqlite databaseAndroid插入sqlite数据库
【发布时间】:2010-04-11 05:24:18
【问题描述】:

我知道我可能遗漏了一件简单的事情,但过去一两个小时我一直在用头撞墙。我有一个用于我目前正在开发的 Android 应用程序的数据库(Android v1.6),我只想将一条记录插入到数据库表中。我的代码如下所示:

//Save information to my table
sql =   "INSERT INTO table1 (field1, field2, field3) " +
        "VALUES (" + field_one + ", " + field_two + ")";
Log.v("Test Saving", sql);
myDataBase.rawQuery(sql, null);

myDataBase 变量是一个 SQLiteDatabase 对象,可以从架构中的另一个表中精细地选择数据。保存似乎工作正常(LogCat 中没有错误),但是当我从设备复制数据库并在 sqlite 浏览器中打开它时,新记录不存在。我还尝试在 sqlite 浏览器中手动运行查询,效果很好。 table1 的表架构是 _id, field1, field2, field3。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 我强烈建议使用参数 ("?") 而不是将字符串连接到查询中。您将面临格式错误的查询或注入攻击的风险。
  • @JimBlackler 您能否举一个使用? 进行上述查询的小例子。我用谷歌搜索但找不到。

标签: android sqlite


【解决方案1】:

您的查询无效,因为您为 3 列提供了 2 个值。您的原始查询应如下所示:

sql = "INSERT INTO table1 (field1, field2) " +
    "VALUES (" + field_one + ", " + field_two + ")";

虽然您的架构包含三个字段。顺便说一句,您可以查看日志以查看来自 sqlite 的实际错误报告。

【讨论】:

  • 我清理了一些代码,不小心删除了值部分的第三个字段。不过很好。
【解决方案2】:

正确答案由 cmets 中的 CommonsWare 给出。您应该使用 execSql() 而不是 rawQuery()。它就像一个魅力。

我认为这对其他人会很有用,而不必通过挖掘 cmets 来找到正确的答案。

【讨论】:

    【解决方案3】:

    由于它是一个字符串值,您忘记添加“'”...这个查询肯定会工作,我测试过

    sql = "INSERT INTO table1 (field1, field2) " + 
    "VALUES ('" + field_one + "', '" + field_two + "')";
    

    【讨论】:

      【解决方案4】:

      我将代码更改为使用 myDataBase.insert() 而不是 rawQuery() 并且它正在工作。我不确定为什么实际的 sql 查询不起作用,所以如果有人能对此有所了解,我仍然会很感激。

      【讨论】:

      • 如果您发布的是确切的查询,那是因为您指定了 3 个字段但只传递了 2 个值。
      • rawQuery() 用于查询。 INSERT 语句不是查询。如果要执行不返回结果集的原始 SQL,请使用 execSQL()
      • 啊,execSql() 是我当时需要的。是的,我在我的代码中传递了 3 个值,但是当我将它粘贴到这里时,它在代码清理中丢失了。谢谢! @CommonsWare,如果您将其作为答案发布在这里,我会感谢您解决它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      相关资源
      最近更新 更多