2010-06-26 13 views
7

के लिए गलत rowid रिटर्न जब मैं की तरह घोषित एक पूर्ण-पाठ खोज डेटाबेस में एक पंक्ति सम्मिलित करें:SQLiteDatabase.insert() आभासी टेबल

CREATE VIRTUAL TABLE foo USING fts3 (bar); 

SQLiteDatabase.insert() विधि एक गलत rowid देता है। यदि तालिका घोषित की गई है:

CREATE TABLE foo (bar VARCHAR(10)); 

यह सही पंक्ति मान देता है। समस्या यह है कि जब मैं विधि से लौटाई गई पंक्तिबद्ध का उपयोग करके सम्मिलित होने के तुरंत बाद डेटाबेस से पूछताछ करता हूं, तो लौटा कर्सर में कोई रिकॉर्ड नहीं होता है। यह केवल डेटाबेस में पहले डालने के लिए सही ढंग से काम करता है। बाद के आवेषण के लिए, एक गलत पंक्तिबद्ध वापस आ गया है।

क्या SQLiteDatabase.insert() विधि से सही पंक्ति प्राप्त करने के लिए मुझे कुछ भी करने की ज़रूरत है?

मैं एंड्रॉइड एसडीके संस्करण 2.1update1 का उपयोग कर रहा हूं।

धन्यवाद, दान

अद्यतन: मैं एक हैक का उपयोग कर निम्नलिखित कोड का उपयोग कर अंतिम पंक्ति आईडी प्राप्त करने के लिए समाप्त हो गया:

private int getLastRowId(SQLiteDatabase db, String table) { 
    Cursor cursor = null; 
    try { 
     cursor = db 
       .rawQuery(String.format(Locale.US, "SELECT MAX(rowid) FROM %s", table), null); 
     if (cursor.moveToFirst()) { 
      return cursor.getInt(0); 
     } else { 
      return 0; 
     } 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 

मेरे मामले में, यह सुरक्षित है क्योंकि केवल एक ही उपयोगकर्ता ऐप तक पहुंच है। सेवा ऐप्स के लिए, यह इस पर निर्भर नहीं हो सकता है कि इसे कैसे कार्यान्वित/उपयोग किया जाता है।

मुझे विश्वास है कि हमें यह समस्या है क्योंकि fts3 तालिकाओं में एक सम्मिलित करते समय, एक से अधिक पंक्ति डाली जाती है। विषय तालिका में और fts3 प्रबंधन तालिकाओं में भी एक पंक्ति डाली जाती है।

+1

क्या आप सुनिश्चित हैं कि एंड्रॉइड 'उपयोग करने वाले fts' का समर्थन करता है? आखिरकार मुझे पता था, वह एंड्रॉइड एसक्यूएलसाइट बिल्ड का हिस्सा नहीं था। मैंने पिछले कुछ रिलीज में इसके बारे में कुछ नहीं सुना है, इसलिए शायद उन्होंने इसे जोड़ा, लेकिन मुझे लगता है कि उन्होंने इसका उल्लेख किया होगा। – CommonsWare

उत्तर

1
SQLite Full-Text Search से

:

आपका तालिका कम से कम 1 पाठ क्षेत्र शामिल होना चाहिए।

पीएस: +1: मुझे Virtual Tables के बारे में पता नहीं था। धन्यवाद।

+1

SQLite में, सभी FTS3 कॉलम प्रकार टेक्स्ट हैं। कॉलम के लिए टाइप विनिर्देशों को अनदेखा किया जाता है (http://www.sqlite.org/fts3.html#section_1_1)। एफटीएस 3 वर्चुअल टेबल का कार्यान्वयन है। – Dan

+0

@ उपयोगकर्ता 376859: ओह, अच्छा बिंदु। क्या आपने लिंक से नमूना कोड देखा था? – Macarse

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