4

I'm curious about the design of the Android SQLite API. For example, we have

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

for SQLs that don't return data, and we also have

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

for SQLs that do return data.

Why are the arguments expected as an Object array in the former and as a String array in the latter case? I understand that accepting only Strings might make sense due to SQLite's type affinity. However, if that is the case, why not consistently use String arrays for arguments? Is there some non-String argument that makes sense for execSQL but not for rawQuery?

4

2 に答える 2

0

実際、文字列だけを受け入れることは意味がありませ。文字列は数値と同じになることは決してないからです。

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

数字を含むレコードは返されません。(すべての列をとして宣言する必要があります。TEXT式を使用したり、のようなものに変換したりしないでCAST(... AS TEXT)ください。)

イェンスは考えられる説明に言及しましたが、それは一貫性のない明白な悪いデザインの言い訳にはなりません。

于 2012-11-06T16:51:56.203 に答える
0

ここに一つ。たとえば、BLOB 値を比較する場合です。このを見てください。

BLOBとして保存されたUUID

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 に答える