4

我对Android SQLite API的设计很好奇。例如,我们有

public void execSQL(String sql, Object[] bindArgs) 

对于不返回数据的 SQL,我们也有

public Cursor rawQuery(String sql, String[] selectionArgs) 

对于确实返回数据的 SQL。

为什么在前一种情况下参数预期为 Object 数组,而在后一种情况下为 String 数组?我知道由于 SQLite 的类型亲和力,只接受字符串可能是有意义的。但是,如果是这样,为什么不始终使用字符串数组作为参数呢?是否有一些非字符串参数对 有意义execSQL但对 没有意义rawQuery

4

2 回答 2

0

有一个。例如,如果您想比较 BLOB 值。看看这个例子

UUID 存储为 BLOB

db.execSQL("DELETE FROM "+USER_TABLE+" WHERE "+USER_UUID+"=?",
        new Object [] { uuid.toByteArray }

根据文档,bindArgs 支持byte[] 、String、Long 和 Double。但是,建议使用此方法执行 SELECT/INSERT/UPDATE/DELETE 语句。

我只是不知道为什么。

于 2014-12-14T02:04:36.523 回答
0

实际上,只接受字符串是没有意义的,因为字符串永远不会与数字相等,即像这样的查询

c.rawQuery("SELECT * FROM mytable WHERE some_number_column = ?", args);

永远不会返回任何带有数字的记录。(您必须将所有列声明为TEXT,并且永远不要使用表达式或将它们转换为类似的东西CAST(... AS TEXT)。)

Jens 提到了一种可能的解释,但这并不是不一致和明显糟糕设计的借口。

于 2012-11-06T16:51:56.203 回答