2010-05-06 46 views
3

在一個大應用程序中搜索了很多錯誤之後,我終於找到了這個錯誤。這個日誌抓住了問題:Android遊標奇怪的行爲

Log.d(TAG,"buildList, DBresult.getInt(1): "+DBresult.getInt(1)); 
Log.d(TAG,"buildList, DBresult.getString(1): "+DBresult.getString(1)); 
Log.d(TAG,"buildList, DBresult.getInt(4): "+DBresult.getInt(4)); 
Log.d(TAG,"buildList, DBresult.getString(4): "+DBresult.getString(4)); 

輸出結果:

05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getInt(1): 0 
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getString(1): false 
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getInt(4): 0 
05-06 11:11:20.123: DEBUG/TodoList(18943): buildList, DBresult.getString(4): true 

沒有運行backgroung線程。正如你所看到的,問題是'0'在一次被解釋爲false,在另一個時被解釋爲false。由於我完全喪失瞭如何發生這種情況,我不知道如何繼續。什麼可能導致這種行爲?這兩列的類型都是「boolean」,即sqlite中的一個數字。不幸的是,返回的字符串是正確的值,而整數始終爲0.如果我將數據庫導出到我的計算機並使用SQlite Administrator進行檢查,我可以看到值已正確設置,它只是getInt()函數總是返回0.我知道這個事實,這在我編碼的其他應用程序中起作用,我不知道爲什麼它停止工作。

我試着編譯2.0,2.0.1和2.1下的代碼,它總是出現。我可以通過獲取像這樣的布爾值來使我的應用程序再次運行:

myBool= (DBresult.getString(0).equals("true")); 

但這樣既醜又不優化。歡迎任何關於造成這種行爲的建議。

乾杯,

+1

請問您可以添加插入語句和表格詳細信息嗎? – Karan 2010-05-06 10:28:13

+0

謝謝,由於您的要求,我直接跑到了問題的來源=) – pgsandstrom 2010-05-06 12:13:39

+0

我覺得有趣的是沒有getBoolean方法實現。不過,我傾向於使用整數而不是布爾值,因爲空間非常便宜。 – Kieveli 2010-05-06 12:31:42

回答

1

我相信我解決了它: - 功能 更新到數據庫界面後插入之前備份所有數據通過將String.valueOf()被轉換成字符串。因此,而不是「1」,「真」被輸入到數據庫中。我的數據庫管理工具沒有顯示差異。爲什麼這是用getInt()函數轉換爲'0',我不知道,但這似乎是問題所在。

+0

所以你說的列類型不是'布爾',但意外轉換爲'字符串'類型列? – Kieveli 2010-05-06 12:29:56

+0

不完全。該列是用「myColumn boolean not null」之類的東西來定義的。但布爾在sqlite中並不存在,但應該將其保存爲int,如0或1(http://www.sqlite.org/datatype3.html)。因此,雖然我只是將布爾值放在ContentValues中,但在更新之後,我將Content.Value中的String.valueOf(布爾值),即字符串「true」或「false」。說實話,我對數據庫知之甚少,不瞭解數據庫是如何解釋的,但卻導致了我奇怪的錯誤,不幸的是數據庫管理工具沒有解釋這個問題。 – pgsandstrom 2010-05-06 13:10:20

+0

getInt()將返回您指定的字段的值。但是,如果該字段不是Integer類型,那麼它將使用Integer.valueOf(),它將返回0,因爲它不能轉換字符串「true」。 – Karan 2010-05-06 17:13:41