2012-10-26 14 views
5

私はアンドロイドアプリでデータベーステーブルを作成しました。私はこのクエリを使用する:Android - ContentValueとboolean型バグのあるデータベース?

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

Iは、テーブルに行を追加よりも、myboolの値はtrueなること。
私はテーブルの値を参照するにsqlite3コマンドを実行した、と私は見た:

corretある
_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; 

をしかし、それは奇妙だが。

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

答えて

0

getAsBooleannullBoolean.FALSE、またはBoolean.TRUEのいずれかになりますが、booleanBooleanラッパーオブジェクトを返しません。 NULLが存在しないことを確認できる場合は、values.getAsBoolean("mybool").booleanValue()を使用して実際の値を取得します。

1

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

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

ContentValues.getAsは、キーが見つかる可能性がある場合は値を返し、できない場合はnullを返し、値が変換できない場合はnullを返します。十分なテストをしていることを確認してください。

0

、それはこの問題に対する最善の解決策だかどうかは知りませんが、以下のこのコードは、私の作品:

Integer result = contentValues.getAsInteger(attributeName); 
      if(result == null || result == 0) { 
       parameter = false; 
      } else { 
       parameter = true; 
      } 
6

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

これはAndroidのバグのようです。

+0

私は同意します!私はあなたに[報告しました](https://code.google.com/p/android/issues/detail?id=54600)を推測しています... – gengkev

0

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

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

関連する問題