2012-10-26 11 views
5

मैंने अपने एंड्रॉइड ऐप में डेटाबेस टेबल बनाया है। मैं इस प्रश्न का प्रयोग किया:एंड्रॉइड - बुलियन बग के साथ 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 फ़ंक्शन में हमेशा क्यों मिलता है? ContentValues कक्षा में कोई बग है? क्या किसी और को भी यह समस्या हो रही है?

उत्तर

0

getAsBoolean एक boolean लेकिन एक Boolean आवरण वस्तु है, जो या तो null, Boolean.FALSE, या Boolean.TRUE हो सकता है वापस नहीं करता है। यदि आप सुनिश्चित कर सकते हैं कि NULL एस नहीं हैं, तो वास्तविक मान प्राप्त करने के लिए values.getAsBoolean("mybool").booleanValue() का उपयोग करें।

1

आपने यहां कुछ कोड छोड़ा है।

आपका प्रमाण क्या है कि value.getAsBoolean ("mybool") झूठी वापसी करता है? आपको एक बूलियन वापस करना होगा। आप इसे कैसे देख रहे हैं

ContentValues.getA एक मान देता है यदि कुंजी पाई जा सकती है, या शून्य अगर यह नहीं हो सकता है या यदि मान परिवर्तित नहीं किया जा सकता है। सुनिश्चित करें कि आप एक पूर्ण परीक्षण कर रहे हैं।

0

मैं अगर यह इस समस्या के लिए सबसे अच्छा समाधान है, लेकिन नीचे इस कोड मेरे लिए काम करता नहीं जानता:

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

DatabaseUtils.cursorRowToContentValues ​​() भंडार तारों के रूप में सब कुछ (धब्बे को छोड़कर)। ContentValues.getAsBoolean() स्ट्रिंग को एक बूलियन में परिवर्तित करने का प्रयास करेगा (Boolean.valueOf() का उपयोग करके), लेकिन यह केवल तभी काम करता है जब स्ट्रिंग "सत्य" के बराबर होती है, न कि "1"।

यह मेरे लिए एक एंड्रॉइड बग जैसा दिखता है।

+0

मैं मानता हूँ! मैं आपको अनुमान लगा रहा हूं [इसकी सूचना दी गई है) (https://code.google.com/p/android/issues/detail?id=54600) ... – gengkev

0

नीचे की तरह बूलियन परिणाम प्राप्त करें:

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

संबंधित मुद्दे