5

Androidアプリでデータベーステーブルを作成しました。私はこのクエリを使用しました:

CREATE TABLE foo (_id INTEGER PRIMARY KEY AUTOINCREMENT, mybool BOOLEAN)

テーブルに行を追加した場合、の値はmyboolになりますtrue
sqlite3コマンドを実行してテーブルの値を確認したところ、次のようになりました。

  _id    |    mybool
----------------------
   1     |      1

つまり、コレット、true値は1になりました。

奇妙なことは読書にあります。私はそのような表を読みました:

ContentValues values = new ContentValues();
Cursor cursor = db.rawQuery("SELECT * FROM foo", null);
DatabaseUtils.cursorRowToContentValues(cursor, values);

それから私は奇妙な結果を得る:

values.getAsBoolean("mybool"); // return false - WRONG
values.getAsInteger("mybool"); // return 1 = true - CORRECT

私はそのようなコードを使用してブール値を取得します:

values.getAsInteger("mybool") != 0; 

しかし、それは奇妙です。

なぜ私はいつも関数に入るfalseのですか?クラスgetAsBooleanにバグはありますか?ContentValuesこの問題を抱えている人は他にいますか?

4

5 に答える 5

7

DatabaseUtils.cursorRowToContentValues()は、すべてを文字列として格納します(blobを除く)。ContentValues.getAsBoolean()は、文字列をブール値に変換しようとしますが(Boolean.valueOf()を使用)、文字列が「1」ではなく「true」に等しい場合にのみ機能します。

これは私にはAndroidのバグのように見えます。

于 2013-04-19T23:51:34.677 に答える
1

ここでいくつかのコードをスキップしました。

values.getAsBoolean( "mybool")がfalseを返すというあなたの証拠は何ですか?ブール値を返す必要があります。どのようにチェックしていますか?

ContentValues.getAsは、キーが見つかった場合は値を返し、見つからなかった場合、または値を変換できない場合はnullを返します。完全なテストを行っていることを確認してください。

于 2012-10-26T23:46:50.903 に答える
0

それがこの問題の最善の解決策であるかどうかはわかりませんが、以下のコードは私にとってはうまくいきます:

Integer result = contentValues.getAsInteger(attributeName);
            if(result ==  null || result == 0) {
                parameter = false;
            } else {
                parameter = true;
            }
于 2013-02-08T17:02:42.113 に答える
0

getAsBooleanを返すのではbooleanなく、Booleanラッパーオブジェクトを返します。これは、、、またはのいずれかnullになります。がないことを確認できる場合は、を使用して実際の値を取得します。Boolean.FALSEBoolean.TRUENULLvalues.getAsBoolean("mybool").booleanValue()

于 2012-10-27T09:40:10.857 に答える
0

以下のようなブール結果を取得します。

boolean result = values.getAsInteger("mybool") == 1;

于 2016-12-29T14:02:35.623 に答える