2011-08-28 7 views
22

मैं जो निम्नलिखित कोड द्वारा बनाई गई है एक एसक्यूएल तालिका है में रिक्त हो, तो:कैसे टेस्ट कर्सर एक SQLiteDatabase क्वेरी

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT 
     + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, " 
     + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER 
     + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA 
     + " TEXT NOT NULL);"); 
} 

इस प्रकार मैं तालिका क्वेरी:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
    + " GROUP BY " + SUBJECT + ";"; 

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

समस्या क्या कर्सर खाली है (यानी तालिका कोई मूल्य नहीं रख रही है) और गतिविधि बी अगर कर्सर खाली नहीं है (यानी तालिका भर जाती है) तो मुझे ए गतिविधि ए शुरू करना होगा।

मैं ऐसी विधि नहीं ढूंढ पा रहा हूं जो मुझे बता सकता है कि तालिका खाली है या नहीं। मैं इस्तेमाल किया लॉग करने की कोशिश की इस प्रकार है:

private void showSubjectsOnList() { 
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
     + " GROUP BY " + SUBJECT + ";"; 

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

    Log.d("Events",Integer.toString(cursor.getCount())); 
    if(cursor.isNull(0)!=false){ 
     cursor.close(); 
     subjects.close(); 
     startActivity(new Intent(this,OpenScreen.class)); 
    } 
} 

लेकिन LOG 1 से पता चलता है, अगर तालिका खाली है ... और फिर 1, अगर तालिका 1 प्रविष्टि है .... यह, 2 से पता चलता है, तो तालिका दो प्रविष्टियां हैं और इसी तरह।

क्या आप कर्सर खाली है या नहीं, इस पर आधारित विभिन्न गतिविधियों को शुरू करने की मेरी समस्या को हल करने की कुछ विधि सुझा सकते हैं।

उत्तर

55

क्या इस तरह कर्सर का परीक्षण, और फिर कर आप क्या कहा है के बारे में:

if(cursor!=null && cursor.getCount()>0) 

getCount()

कर्सर में पंक्तियों की संख्या देता है

http://developer.android.com/reference/android/database/Cursor.html#getCount()

+0

मैंने आपके द्वारा वर्णित तरीके से बिल्कुल प्रयास नहीं किया है। लेकिन मैं रूप में अच्छी तरह के रूप में इस का उपयोग कर कर्सर की कोशिश की = अशक्त,: Log.d (! "घटनाक्रम", Boolean.toString (कर्सर = नल)); दिलचस्प बात यह है कि तालिका में कुछ मूल्य हैं, तो लॉग दिखाता है, लेकिन आश्चर्य की बात है कि तालिका खाली होने पर लॉग बिल्कुल दिखाई नहीं दे रही है। मैं उलझन में हूं इसका मतलब क्या है। –

+0

'कर्सर.मोव टॉफ़र्स्ट()' के साथ कर्सर के पॉइंटर को पहले रिकॉर्ड में ले जाना न भूलें –

+0

का परीक्षण करने से पहले इसका मतलब है कि आपकी क्वेरी शून्य-पंक्तियां लौटाती है। जिसका अर्थ है कि कर्सर शून्य नहीं है लेकिन शून्य पंक्तियां हैं: डी –

22

सबसे आसान और clea घोंसला तरह से एक खाली कर्सर के लिए परीक्षण करने के लिए निम्नलिखित कोड है:

if (cursor.moveToFirst()) { 
    // start activity a 
} else { 
    // start activity b 
} 

डॉक्स के अनुसार, विधि झूठी लौटाता है यदि कर्सर खाली है:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

सार्वजनिक सार बूलियन moveToFirst ()

एपीआई स्तर 1 में जोड़ा गया कर्सर को पहली पंक्ति में ले जाएं।

कर्सर खाली होने पर यह विधि झूठी वापसी होगी

वापस चलता है कि चाल सफल हुई है या नहीं।

+0

कोशिश की गई, लेकिन काम नहीं कर रहा: s –

+0

कर्सर.मोव टूटेक्स्ट() के बारे में क्या ... मुझे लगता है कि यह सच हो जाएगा यदि पंक्तियों और झूठी हैं तो कोई पंक्ति नहीं मिली ... –

+0

@ करूबेन्सनकारू - यह भी हो सकता है। दस्तावेज़ों पर एक नज़र डालें। – SBerg413

0

मेरा सुझाव ListActivity का उपयोग करेगा।

वे गतिविधि हैं जो ListView में आइटम प्रदर्शित करने के लिए हैं। आप उन्हें पॉप्युलेट करने के लिए बस SimpleCursorAdapter का उपयोग कर सकते हैं (ListActivity के जावाडोक पेज में भी सचित्र)।

वे भी एक setEmptyView()-method प्रस्तुत करते हैं, जो प्रदर्शित करने के लिए इस्तेमाल किया जा सकता एक View (हो सकता है एक TextView) जो उपयोगकर्ताओं के ऐसी कोई रिकॉर्ड अभी तक देखते हैं और वह कैसे बना सकते हैं कि।

यह कैसे करें इसे करने के लिए एक उदाहरण here पाया जा सकता है।

+0

प्रिय लुकास Knuth, –

+1

... और बाकी? –

+0

प्रिय लुकास, गतिविधि बी वास्तव में सूची सक्रियता है। उपरोक्त वर्णित विधि शोसब्जेक्टऑनलिस्ट() भी इस गतिविधि में एक विधि है। यदि ShowSubjectsOnList में कर्सर खाली है, तो मैं गतिविधि ए शुरू करना चाहता हूं, अन्यथा मैं एक ही गतिविधि में रहना चाहता हूं ..... लेकिन मैं यह नहीं ढूंढ पा रहा हूं कि कर्सर खाली कैसे है। –

1

आपको केवल getCount() का उपयोग करने की आवश्यकता है। यदि आपका एसक्यूएल सही है लेकिन कोई पंक्ति नहीं लौटाता है तो आपके पास कोई कर्सर ऑब्जेक्ट नहीं होगा लेकिन पंक्तियों के बिना और getCount() वापस आ जाएगा 0.

+0

कृपया विस्तृत करें। –

+0

जब आप अपने डीबी से पूछते हैं तो कर्सर ऑब्जेक्ट हमेशा वापस आ जाता है। उदाहरण के लिए, इसमें आपकी क्वेरी स्ट्रिंग है। तो यह शून्य नहीं हो सकता है: जावा में - पहचानकर्ता जो किसी भी वस्तु से "कनेक्ट" नहीं है, शून्य है। केवल तभी जब आपकी चुनी क्वेरी ने कोई पंक्ति नहीं लौटाई - getCount() शून्य लौटाएगा। – Minolan

+0

हम्म..ओक ... विस्तार के लिए धन्यवाद। लेकिन मैं अपनी समस्या को कैसे हल कर सकता हूं? –

0

मुझे विश्वास है कि आपकी समस्या यह है कि आप एक उचित क्वेरी नहीं बना रहे हैं ।

आपको SQLiteDatabase क्वेरी का उपयोग करना चाहिए।

Cursor c = db.query(TABLE_NAME, null, 
      null, null, null, null, null); 

तब आप यह निर्धारित करने के लिए c.getCount() का उपयोग कर सकते हैं कि तालिका में कुछ भी है या नहीं।

2

हटाए गए रिकॉर्ड SQLite में शून्य रिकॉर्ड के रूप में रहते हैं, लेकिन getCount() केवल शून्य रिकॉर्ड की गणना नहीं करता है। यदि आपकी तालिका में कुछ रिकॉर्ड्स हैं जो शून्य हैं, तो कुछ रिकॉर्ड्स में _IdgetCount() के परिणाम से बड़े होंगे। उन तक पहुंचने के लिए, आप कर्सर को पुन: सक्रिय कर सकते हैं (के लिए() लूप का उपयोग कर getCount() के परिणाम की तुलना में समय की संख्या दोगुना करें और कर्सर का उपयोग सरणी में record_Id संख्याओं को भरने के लिए करें। आइए परिणामस्वरूप सरणी { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 } है।

इसका मतलब है कि रिकॉर्ड 3, 4, 10, 13, शून्य रिकॉर्ड हैं और आपकी तालिका में 14 रिकॉर्ड सभी हैं, 10 नहीं जो आपको getCount() से मिला है।

याद रखें:

  1. getCount() रिटर्न नहीं अशक्त अभिलेखों की संख्या,
  2. कर्सर नहीं अशक्त अभिलेखों का _Id संख्या देता है,
  3. _Id संख्या "याद" कर्सर द्वारा अशक्त अभिलेखों का _Id नंबर दिए गए हैं,
  4. उन सभी को प्राप्त करने के लिए getCount() से पर्याप्त रूप से आगे पहुंचना चाहिए।
संबंधित मुद्दे