6

データベースからいくつかのデータを選択しようとしていますが、それを行うためのコードのスライスが 2 つあります。

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "id = ?", new String[]{getSID(db)}, null, null, null);

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "id = " + getSID(db), null, null, null, null);

それらの違いは、ドキュメントによると最初の方がより正しいように見えることですが、それも機能しません - カーソルが空です。2 番目の代わりに、必要なすべてのデータを取得しています。

そこで、データベースのコピーを使用して PC でさまざまな SQL クエリを実行しようとしましたが、それが得られたものです。

SELECT col1, col2, col3 FROM SomeTables WHERE (id = '42')

これは機能しません (そして、このクエリは明らかに、最初のコード サンプルによって生成されたクエリと同じです)

SELECT col1, col2, col3 FROM SomeTables WHERE (id = 42)

これは正常に動作します (2 番目のコード サンプルのクエリと同じです)。

私が知っているように、SQLite は型キャストを自動的に実行するはずですが、何かがうまくいかず、その理由がわかりません。最初のコード サンプルを修正する方法について何かアイデアはありますか? (または、おそらくデータベース?)

重要な場合は、フィールドを含むテーブルの簡略化されCREATEたスクリプトを次に示します。id

CREATE TABLE SomeTable ( ID PRIMARY KEY, col1, col2, [...] )

UPD:ところで、getSID(db) は文字列オブジェクトを返します。

4

3 に答える 3

2

SQLiteのドキュメントによると、

INTEGER PRIMARY KEY 列を除く、SQLite バージョン 3 データベースの任意の列を使用して、任意のストレージ クラスの値を格納できます。

私の場合の文脈では、それは、どのデータ型が列に格納されるのか確信が持てないことを意味します。データベースにデータを入力するときにデータ型を制御および変換できれば、データベースにデータを追加するときにid値を変換して簡単に使用できます。しかし、データベースのコンテンツをそのまま処理する必要があるため、これは私の質問に対する回答ではありません。TEXTselectionArgs

したがって、可能な解決策:

selectiona)整数値を文字列にラップせずに埋め込みます'

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "id = " + getSID(db), null, null, null, null);

b) selectionArgs:CAST(? as INTEGER)またはから値をキャストしますCAST(id AS TEXT)TEXT右のオペランドは常にですが、左のオペランドは何でもかまいTEXTません。そう:

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "CAST(id AS TEXT) = ?", 
                    new String[]{getSID(db)}, null, null, null);
于 2013-08-02T12:49:26.950 に答える