2012-10-26 14 views
5

我在我的android應用程序中創建了數據庫表。我用這個查詢:Android - 帶有布爾錯誤的ContentValue數據庫?

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

比我添加的行表,那的mybool值將是true
我跑了sqlite3的命令來查看該表中的值,我看到:

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

也就是說corret,該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

getAsBoolean不返回booleanBoolean包裝對象,其可以是nullBoolean.FALSE,或Boolean.TRUE。 如果您可以確保沒有NULL s,請使用values.getAsBoolean("mybool").booleanValue()來獲取實際值。

1

您在此處跳過了一些代碼。

你有什麼證據顯示values.getAsBoolean(「mybool」)返回false?你必須返回一個布爾值。你如何檢查它?

ContentValues.getAs返回一個值,如果可以找到該鍵,或者如果它不能或如果該值不能轉換,則返回null。確保你正在做一個完整的測試。

0

我不知道這是否是對這個問題的最佳解決方案,但下面這段代碼工作對我來說:

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

DatabaseUtils.cursorRowToContentValues()把所有東西作爲字符串(除了斑點)。 ContentValues.getAsBoolean()將嘗試將字符串轉換爲布爾值(使用Boolean.valueOf()),但只有當字符串等於「true」而不是「1」時才起作用。

這看起來像是一個Android bug。

+0

我同意!我猜你[報道](https://code.google.com/p/android/issues/detail?id=54600)... – gengkev

0

獲取布爾結果如下圖所示:

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