2011-04-18 14 views
14

इसलिए मैं डबल मानों का ऑर्डर सेट सहेजना चाहता हूं, और मैं इसे आसानी से किसी भी मान को सम्मिलित करने, पुनर्प्राप्त करने या हटाने में सक्षम होना चाहता हूं। इस प्रकार, मैं एक ऐरेलिस्ट का उपयोग कर रहा हूं, जहां मैं डबल मानों को स्टोर करने के लिए डबल्स नामक एक कक्षा को परिभाषित करता हूं।SQLite डेटाबेस में ArrayLists सहेजना

मैं इस सरणी सूची को SQLite डेटाबेस में रिकॉर्ड में कैसे संग्रहीत करूं? मेरा मतलब है ... कॉलम का प्रकार क्या होना चाहिए? क्या यह किया जा सकता है?

उत्तर

48

आप सीधे सरक्लाइट में ArrayList नहीं डाल सकते हैं। इसके बजाय, आप ArrayList डालने के लिए JSONObject (org.json.JSONObject) का उपयोग कर सकते हैं। टुकड़ा नीचे की जांच करें, तो आप नीचे की तरह कुछ कोशिश कर सकते हैं ....

सम्मिलित करने के लिए,

JSONObject json = new JSONObject(); 
json.put("uniqueArrays", new JSONArray(items)); 
String arrayList = json.toString(); 

डाटाबेस में स्ट्रिंग।

पढ़ें करने के लिए, स्ट्रिंग के रूप में डाटाबेस से स्ट्रिंग पढ़ें,

JSONObject json = new JSONObject(stringreadfromsqlite); 
    ArrayList items = json.optJSONArray("uniqueArrays"); 
+0

यह वास्तव में दिलचस्प लगता है! मैं इसे देख लूंगा और देख सकता हूं कि यह कैसे काम करता है। – Achint

+0

यह कमाल है। – leparlon

+0

हाय क्या आप stringreadfromsqlite के बारे में अधिक समझा सकते हैं। – max

0

मैं सुझाव देता हूं कि सभी 3 Notepad tutorials के माध्यम से आप अपने स्टॉक को डेटाबेस तालिका में संग्रहीत करना चाहते हैं। आप वास्तविक सरणी को डेटाबेस में सीधे डेटा में संग्रहीत नहीं करते हैं। लेकिन आपको वास्तव में सरणी में एक नया आइटम जोड़ने की बजाय किसी सरणी का उपयोग करने की आवश्यकता नहीं है, इसके बजाय अपनी डीबी डालने विधि

-1

एक dbHelper वर्ग जो एक आंतरिक वर्ग और काफी जो कुछ नोटपैड ट्यूटोरियल का कहना है बनाएँ। कक्षा में इस तरह की प्रविष्टि विधि होनी चाहिए: -

public long insertRows(ContentValues values, String tableName) { 
    long val = myDatabase.insert(tableName, null, values); 
    return val; 
} 

यह विधि तालिका पंक्ति में मान जोड़ देगा। इसके बाद आप इस विधि को अपनी मुख्य गतिविधि से कॉल कर सकते हैं और चूंकि आप कर्सर का उपयोग कर रहे हैं, मुझे विश्वास है कि आप विधि को लूप

(i = 0; list.length(); i ++) के लिए विधि को कॉल करेंगे या हो सकता है इसके list.size: पी

{

// विधि यहाँ

कॉल} में विधि को फोन करके डेटाबेस में मूल्य जोड़ने रखने के पाश

के लिए
0

मुझे अपने आवेदन में कुछ ऐसा करने की ज़रूरत है, जहां मेरे पास एक कस्टम क्लास (फू, बार इत्यादि) है और मेरे पास foo, bar, आदि का ऐरेलिस्ट है जो मैं SQL पर रहता हूं। एसक्यूएल का मेरा ज्ञान मजबूत नहीं है, लेकिन अगर यह मदद करता है तो मैं यहां अपना दृष्टिकोण समझाऊंगा। मेरी समझ यह है कि किसी भी प्रकार की वस्तु को स्टोर करने के लिए, आपको उस ऑब्जेक्ट प्रकार के लिए एक विशेष तालिका को परिभाषित करने की आवश्यकता होती है, जहां तालिका में उस ऑब्जेक्ट के भीतर आदिम प्रकारों का प्रतिनिधित्व करने वाले अलग कॉलम होते हैं। इसके अलावा, उन वस्तुओं के एक ArrayList को बनाए रखने और पुनर्प्राप्त करने के लिए, आप एक ArrayList एंट्री के लिए एक टेबल पंक्ति का उपयोग करेंगे, और एक लूप में स्टोर और पुनर्प्राप्त करने के लिए फिर से चालू करें।

मेरे आवेदन में कई कस्टम वर्गों के ऐरेलिस्ट हैं जो मैं डीबी को जारी रखना चाहता था। तो, चीजों को साफ करने के लिए (ठीक है, मेरे लिए कम से कम - मैं अभी भी एक अपेक्षाकृत नया जावा/एंड्रॉइड प्रोग्रामर हूं, इसलिए इसे नमक के चुटकी से लें) मैंने एक प्रकार का "एसक्यूएल सीरियलज़ेबल इंटरफेस" लागू करने का फैसला किया है कि मेरा डीबी-सतत वस्तुओं को लागू करना चाहिए। प्रत्येक वस्तु (फू, बार, आदि) जिसे डीबी को लागू किया जाना चाहिए:

  1. एक सार्वजनिक स्थिर अंतिम TABLE_NAME स्ट्रिंग, इस ऑब्जेक्ट प्रकार के लिए उपयोग की जाने वाली SQL डीबी तालिका का नाम।
  2. एक सार्वजनिक स्थिर अंतिम TABLE_CREATE_STRING, इस ऑब्जेक्ट के लिए तालिका बनाने के लिए एक पूर्ण SQL निर्देश।
  3. एक ContentValues ​​ऑब्जेक्ट से अपने सदस्य चर को पॉप्युलेट करने के लिए एक कन्स्ट्रक्टर विधि।
  4. अपने सदस्य चर से ContentValues ​​को पॉप्युलेट करने के लिए 'get' विधि।

तो, कहें कि मेरे पास ऑब्जेक्ट्स फू और बार ऑरेलिस्ट हैं। जब डीबी पहली बार बनाया गया है, तो मेरे डीबी सहायक वर्ग के भीतर मैं उन वस्तुओं के लिए टेबल बनाने के लिए Foo.TABLE_CREATE_STRING, Bar.TABLE_CREATE_STRING आदि को कॉल करता हूं। inputArray को

ArrayList<String> inputArray=new ArrayList<String>(); 

//....Add मान

Gson gson = new Gson(); 

String inputString= gson.toJson(inputArray); 

System.out.println("inputString= " + inputString); 


use "inputString" to save the value of ArrayList<String> in SQLite Database 

पुनर्प्राप्त करने के लिए:

cursor = dbh.retrieve(Foo.TABLE_NAME); 
if(!cursor.moveToFirst()){ 
    return false 
} 
do{ 
    DatabaseUtils.cursorRowToContentValues(cursor, vales); 
    FooArrayList.add(new Foo(values)); 
} while(cursor.moveToNext()); 
12

डालें करने के लिए:

मेरी ArrayList भर दें, मैं की तरह कुछ का उपयोग :

स्ट्रेट प्राप्त करें SQLiteDatabse से जो आपने सहेजा और नीचे ArrayList प्रकार में बदल दिया:

outputarray एक स्ट्रिंग है जो इस उदाहरण के लिए SQLiteDatabase से प्राप्त होता है।

Type type = new TypeToken<ArrayList<String>>() {}.getType(); 

ArrayList<String> finalOutputString = gson.fromJson(outputarray, type); 
+1

धन्यवाद! यह मेरे मामले में मदद की। पीएस यह सभी प्रकार के ArrayList के साथ काम करता है, न केवल

+1

के साथ उदाहरण के लिए मैं ArrayList का उपयोग करता हूं, लेकिन हम अन्य डेटा प्रकार का उपयोग कर सकते हैं और यहां तक ​​कि हम विशिष्ट वर्ग ऑब्जेक्ट के रूप में टाइप भी सेट कर सकते हैं। – Ashok

+0

मुझे एक त्रुटि मिलती है ... जीसन को हल नहीं कर सकता ... :(.. क्या कोई मेरी मदद कर सकता है? – Benedict

0

मेरे मामले में यह था POJO वर्गों के ArrayList नोट

private String mNoteTitle; 
private int mFingerIndex; 
private Point mNoteCoordinates; 

public Note(String noteTitle, int fingerIndex, Point noteCoordinates) { 
    this.mNoteTitle = noteTitle; 
    this.mFingerIndex = fingerIndex; 
    this.mNoteCoordinates = noteCoordinates; 
} 

मैनुअल कहते हैं JSONObject केवल निम्न प्रकारों का समर्थन करता है: ऑब्जेक्ट: एक JSONObject, JSONArray, स्ट्रिंग, बूलियन, पूर्णांक, लांग, डबल, नल, या शून्य। NaNs या infinities नहीं हो सकता है। इसलिए, मुझे अपनी नोट क्लास को समर्थित ऑब्जेक्ट्स में तोड़ना चाहिए।

JSONObject json = new JSONObject(); 
    JSONArray jsonArray = new JSONArray(); 

    for(Note note: chordShape.getNotes()){ 
     JSONObject singleNoteJsonObject = new JSONObject(); 

     try { 
      singleNoteJsonObject.put(SHAPE_NOTE_TITLE, note.getNoteTitle()); 
      singleNoteJsonObject.put(SHAPE_NOTE_FINGER_INDEX, note.getFingerIndex()); 
      singleNoteJsonObject.put(SHAPE_NOTE_X, note.getNoteCoordinates().x); 
      singleNoteJsonObject.put(SHAPE_NOTE_Y, note.getNoteCoordinates().y); 
     } catch (JSONException e){ 
      e.printStackTrace(); 
     } 

     jsonArray.put(singleNoteJsonObject); 

    } 

पैक JSONObject में सरणी बनाई गई।

try { 
     json.put(SHAPE_NOTES, jsonArray); 
     Log.i(TAG, json.toString()); 
    } catch (JSONException e){ 
     e.printStackTrace(); 
    } 

स्ट्रिंग बनाएं। ContentValues ​​में

String notesList = json.toString(); 

रखें बनाई स्ट्रिंग, मेरे मामले में कारण यह Android एप्लिकेशन है

if(notesList.length() > 0){ 
     contentValues.put(DatabaseHelper.SHAPE_NOTES_LIST, notesList); 
    } 

और जब मैं SQLite डेटाबेस से मानों पढ़ना चाहिए।

ArrayList<Note> notes = new ArrayList<>(); 
    while(cursor.moveToNext()){ 
     JSONObject jsonNotes = null; 
     try { 
      jsonNotes = new JSONObject(cursor.getString(cursor.getColumnIndex(DatabaseHelper.SHAPE_NOTES_LIST))); 
     } catch (JSONException e){ 
      e.printStackTrace(); 
     } 

     if(jsonNotes != null){ 
      Log.i(TAG, jsonNotes.toString()); 
      JSONArray jsonArray = jsonNotes.optJSONArray(SHAPE_NOTES); 
      for(int i = 0; i < jsonArray.length(); i++){ 
       Note note = null; 
       JSONObject arrayObject = null; 

       try { 
        arrayObject = jsonArray.getJSONObject(i); 
       } catch (JSONException e){ 
        e.printStackTrace(); 
       } 

       if(arrayObject != null){ 
        try { 
         note = new Note(
          arrayObject.getString(SHAPE_NOTE_TITLE), 
           arrayObject.getInt(SHAPE_NOTE_FINGER_INDEX), 
           new Point(
             arrayObject.getInt(SHAPE_NOTE_X), 
             arrayObject.getInt(SHAPE_NOTE_Y) 
           ) 
         ); 
        } catch (JSONException e){ 
         e.printStackTrace(); 
        } 
       } 


       if(note != null){ 
        notes.add(note); 
       } 
      } 
     } 
    } 
    cursor.close(); 
संबंधित मुद्दे