2011-06-09 18 views
8

में किसी कॉलम के डेटाटाइप को इंडेंटिफाइंग करना एंड्रॉइड में कर्सर में कॉलम के डेटाटाइप की पहचान करने का कोई तरीका है। कर्सर ऑब्जेक्ट में कॉलमनाम, कॉलम मान प्राप्त करने के लिए कई विधियां हैं।SQLite एंड्रॉइड कर्सर

मैं स्तंभ (पाठ, पूर्णांक) आदि की SQLite डेटाप्रकार पता लगाना चाहते हैं ...

मैं एक कर्सर को पार्स करने और कार्रवाई करने के लिए एक सामान्य समारोह लिख रहा हूँ। मैं केवल एक एसक्यूएल स्ट्रिंग को समारोह के लिए तर्क के रूप में प्राप्त करूंगा।

उत्तर

6

प्रति SQLite प्रलेखन (http://www.sqlite.org/datatype3.html) SQLite में स्तंभों एक डेटाप्रकार नहीं है।

किसी इंटेग्रियर प्राथमिक कुंजी कॉलम को छोड़कर SQLite संस्करण 3 डेटाबेस में कोई भी कॉलम किसी भी स्टोरेज क्लास के मान को संग्रहीत करने के लिए उपयोग किया जा सकता है।

आप ऊपर एपीआई स्तर 11 या उपयोग कर रहे हैं तो कर्सर getType() (http://developer.android.com/reference/android/database/AbstractWindowedCursor.html#getType(int) देखें) का समर्थन करता है।

आप पहले के एक एपीआई स्तर उपयोग कर रहे हैं, और आप जानते ही मेज से आते हैं एक दिया कर्सर में सभी परिणाम तो आप (untested) की तरह कुछ कर सकता है कि:

// Assumes "cursor" is a variable that contains the cursor you're 
// interested in. 

String tableName = "..."; // The name of the table 
SQLiteDatabase db = cursor.getDatabase(); 
String[] names = cursor.getColumnNames(); 

for (name : names) { 
    Cursor typeCursor = 
     db.rawQuery("select typeof (" + name + ") from " + tableName; 
    typeCursor.moveToFirst(); 
    Log.v("test", "Type of " + name + " is " + typeCursor.getString(0); 
} 

लेकिन उस इच्छा (मुझे उम्मीद है) अगर पारित कर्सर (उदाहरण के लिए) db.rawQuery() कॉल का परिणाम दो या दो से अधिक तालिकाओं में शामिल हो गया तो विफल हो गया।

+0

धन्यवाद निक, यह एक सुंदर साफ विचार था। लेकिन क्या आपको लगता है कि जेडीबीसी के परिणामसेट का उपयोग भी किया जा सकता है? मैं पढ़ रहा हूं कि जेडीबीसी Google द्वारा समर्थित नहीं है। – Arun

+0

संभवतः - मेरे पास कोई निश्चित उत्तर नहीं है, मुझे डर है। हालांकि, आप अभी भी गलत अंत से इसका सामना कर रहे हैं। जैसा कि मैंने कहा, SQLite कॉलम में वास्तव में डेटा प्रकार नहीं हैं, यह उस कॉलम में मान है जिसमें टाइप है। तो आपके पास तीन पंक्तियां और कॉलम "foo" हो सकता है, और पंक्ति 1 में सामग्री टेक्स्ट की तरह दिखती है, पंक्ति 2 में वे एक int की तरह दिखते हैं, और पंक्ति 3 में सामग्री बाइनरी ब्लॉब की तरह दिखती है। कॉलम का डेटा प्रकार मदद नहीं करेगा। शायद आप वास्तव में जो हासिल करने की कोशिश कर रहे हैं उसके बारे में अधिक जानकारी के साथ आप अपने प्रश्न में संशोधन कर सकते हैं और मैं एक उचित समाधान का सुझाव दे सकता हूं। – Nik

+0

इस बारे में अधिक जानकारी के लिए http://stackoverflow.com/questions/5896348/to-get-resultset-from-pre-complie-statement-in-android/7270433#7270433 देखें। –

1

आप SQLite डेटाबेस से meta data उपयोग करना चाहिए:

http://developer.android.com/reference/java/sql/ResultSetMetaData.html

आप एक ResultSet पर getMetaData() का उपयोग करके यह आइटम प्राप्त()।

इसलिए, यह एंड्रॉयड है कि आप का उपयोग करेगा में एक SQLite डेटाबेस का उपयोग करने का हमेशा की तरह नहीं है, लेकिन हमेशा की तरह JDBC रास्ता:

  1. एक कनेक्शन (ड्राइवर प्रबंधक getConnection के माध्यम से) प्राप्त
  2. एक बयान मिलता है (connection.createStatement के माध्यम से)
  3. एक resultset (statement.executeQuery के माध्यम से) प्राप्त
  4. मेटा डेटा (resultset.getMetaData के माध्यम से) प्राप्त
उन स्तंभ में मान करते हैं -

सादर, स्टीफन

+0

धन्यवाद स्टीफन, मैं वर्तमान में एक का उपयोग कर रहा एंड्रॉइड कर्सर ऑब्जेक्ट (android.database.cursor) जिसे SQLiteDatabase.rawQuery विधि से वापस किया गया है। परिणामसेट प्राप्त करने के लिए मुझे किस प्रक्रिया का उपयोग करना चाहिए। खोज रहे थे, लेकिन डेटाबेस से कनेक्ट करने और परिणाम प्राप्त करने का कोई तरीका नहीं ढूंढ रहा था। – Arun

+0

स्ट्रिंग url = "jdbc: sqlite: /data/data/app.name/databases/Database"; कक्षा .forName ("SQLite.JDBCDriver"); कनेक्शन con = DriverManager.getConnection (url); परिणामसेट आरएस = con.createStatement()। ExecuteQuery (sql); con.close(); – Arun

+0

लेकिन मैंने पढ़ा है कि जेडीबीसी Google द्वारा समर्थित नहीं है। क्या यह जेडीबीसी या निर्मित android.sqlite ऑब्जेक्ट का उपयोग करने की सलाह दी जाती है? – Arun

5

उत्तर या एनआईके ठीक है। लेकिन अगर आपका डीबी खाली है, तो यह दुर्घटना। मैं उपयोग

String Query = "PRAGMA table_info(my_table_name)"; 
Cursor my_cursor = db.rawQuery(Query, null); 
my_cursor.moveToFirst(); 
Column_name = my_cursor.getString(my_cursor.getColumnIndex("name")); 
Column_type = my_cursor.getString(my_cursor.getColumnIndex("type")); 
+0

यह सभी Androids संस्करणों (एपीआई) में काम करता है? – IgniteCoders

1

मैं अभी तक परीक्षण नहीं किया था सुझाव है लेकिन, cursor.getType (i)

इस तरह

इस्तेमाल करने की कोशिश:

public static List resultSetToArrayListAndroid(Cursor cursor) throws SQLException { 
    int columns = cursor.getColumnCount(); 
    ArrayList list = new ArrayList(); 
    while (cursor.moveToNext()) { 
     HashMap row = new HashMap(columns); 
     for (int i = 1; i <= columns; ++i) { 
      switch (cursor.getType(i)) { 
       case Cursor.FIELD_TYPE_FLOAT: 
        row.put(cursor.getColumnName(i), cursor.getFloat(i)); 
        break; 
       case Cursor.FIELD_TYPE_INTEGER: 
        row.put(cursor.getColumnName(i), cursor.getInt(i)); 
        break; 
       case Cursor.FIELD_TYPE_STRING: 
        row.put(cursor.getColumnName(i), cursor.getString(i)); 
        break; 
      } 
     } 
     list.add(row); 
    } 
    return list; 
} 
संबंधित मुद्दे