【问题标题】:Android sqlite delete row failureAndroid sqlite删除行失败
【发布时间】:2011-09-11 04:47:59
【问题描述】:

我正在尝试删除我知道该行存在的表中的一行。我试过了:

final String s = "DELETE from %s where Name = '%s'";        
String sql = String.format(s, GetTableName(), sListName);
Cursor cr= GetUserDb().GetSQLiteDb().rawQuery(sql, null);

我试过了:

String sWhere = String.format("Name = '%s'", sListName);
long lRowsUpdated = GetUserDb().GetSQLiteDb().delete(GetTableName(), sWhere, null);


** sWhere >> Name = 'groceries' **
** sql >> DELETE from Lists where Name = 'groceries' **

没有崩溃或 logcat 异常,但该行仍未删除。有什么我想念的吗?也许我在其他地方锁定了它,或者我需要在我的 Manifest 中设置某些权限或其他什么?

【问题讨论】:

  • 另外,我的主键是 sListName,它是 TEXT,不确定是否重要...
  • 嗯...你确定 String.format() 吗?它返回正确的语句吗?试试 String sql = String.format(s, new Object[]{GetTableName(), sListName});
  • @mihail - 谢谢。我尝试了您的建议,其中 sql = DELETE from Lists where Name = 'groceries' 并且仍然没有删除该行,并且没有抛出错误。我认为这个问题完全是另外一回事......
  • 尝试执行 GetUserDb().GetSQLiteDb().execSQL(sql);但它是无效函数

标签: android sqlite delete-row


【解决方案1】:

使用 SqliteDatabase 中的 delete() - 这将返回受影响的行数。例如。 delete(tablename, "name=?", new String[] { aString } )

【讨论】:

  • 谢谢,正如您在我的原始帖子中看到的那样,我确实尝试过,但没有运气。
  • 请显示创建语句和有关值的示例。代码没有问题 - 它必须是值。
  • a.) 您对表名(列表)、列(名称)使用混合大小写,而您的列表值是小写(杂货)?真的是小写吗? b.) 当您尝试删除该行时是否有打开的游标? c.) 您的数据库中是否存在某种参照完整性(PK=grocerie 是另一个表中的 FK)?
  • 我怀疑 Harald 可能在这里有所作为。我还没有机会测试它...谢谢哈拉尔德的小费!
  • 哈拉德成功了。主键是“杂货”,我的查询使用了“杂货”。该死的区分大小写!
【解决方案2】:

试试这个:

       SQLiteStatement stmt = db.compileStatement("DELETE FROM " + getTableName() + "WHERE Name=?");
       stmt.bindString(1, sListName);
   stmt.execute();

【讨论】:

  • 谢谢,不过你怎么知道 stmt.execute() 是否成功?
  • 由于某种原因,Android 没有返回在低于 11 的 API 版本中删除的行数(executeUpdateDelete())的方法......但我个人正在删除我知道的行那里。如果不成功,则表示该行不存在 - 这意味着无论如何我都会得到想要的结果......
  • 别忘了最后调用 stmt.close()
  • 没用。结果相同,我认为这不是我如何调用我的 sql 删除,而是我的表的结构可能如何......主键必须是 _ID 吗?我的主键是 TEXT (sListName)
  • AFAIK,如果您使用游标适配器,您的主键必须是 _id。不知道这是否是其他目的的要求,尽管由于这个事实,我的主键始终是 _id。
【解决方案3】:

如果您尝试获取密钥的列是 sListName,则您应该删除 where sListName = '%s' 除非您有另一个名为 Name 的列要尝试删除,但如果不是您的主键可能最终会在您的删除中得到两行。

您始终可以使用模拟器和 adb shell,然后运行 ​​sqlite3 shell 命令并尝试您的 SQL 语句。如果你输入你的并且影响了 0 行,你就知道你的语句搞砸了,而不是你的 java。

如果您没有使用任何内置的 CurorAdapters 或 ContentProviders,则您的主键不需要命名为 _ID,它可以命名为任何名称。至于类型,在 SQLite3 中,它实际上只是一个关于如何转换它的建议,您可以将任何数据放在您想要的任何列中。

【讨论】:

  • 谢谢。我的语句返回 0 行,这意味着它没有删除任何内容。我确实使用 : delete where sListName = 'Test' 所以我知道我的 SQL 语句是正确的。我知道该行在那里,因为我在此之前运行了一个查询来验证....我只是不知道可能是什么问题。会不会是我运行的最后一个查询导致了问题?
  • 你的表架构是什么?我不相信这不是导致问题的列名/变量名/查询名混合使用的问题。
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2023-04-09
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多