2012-08-22 10 views
16

मैं एक एंड्रॉइड ऐप प्रोग्रामिंग कर रहा हूं जिसे डेटा स्टोर करने और इसे पढ़ने के लिए डेटाबेस का उपयोग करना चाहिए। this tutorial (on archive.org) का उपयोग करके मुझे एक डेटाबेस बनाने के लिए ऐप मिला और मैं नई प्रविष्टियां बनाने में सक्षम हूं, हालांकि, मुझे नहीं पता कि सूची सूची में संग्रहीत डेटा प्राप्त करने के लिए डेटाबेस को कैसे पढ़ा जाए। मुझे पता है कि इस वेबसाइट पर कई समान प्रश्न हैं लेकिन ऐसा लगता है कि उनमें से कोई भी रास्ते पर लागू नहीं होता है, ट्यूटोरियल से डेटाबेस काम करता है।एंड्रॉइड: डेटाबेस से डेटा देखने के लिए SimpleCursorAdapter का उपयोग

कोड:

import java.util.Calendar; 

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter; 
import android.app.AlertDialog.Builder; 
import android.app.ListActivity; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ListView; 


public class Marks extends ListActivity { 

DBAdapter db = new DBAdapter(this); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.marks); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    db.open(); 

    getData(); 
} 

@SuppressWarnings("deprecation") 
private void getData() { 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      db.getAllMarks(), 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 

    ListView listView = (ListView) findViewById(R.id.marks_list); 
    listView.setAdapter(adapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.marks, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_add: 
     Calendar cal = Calendar.getInstance(); 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     int month = cal.get(Calendar.MONTH); 
     final String date = day + "." + month; 
     Builder builder = new Builder(this); 
     builder 
      .setTitle(R.string.dialog_addmarks) 
      .setItems(R.array.markslist, new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        @SuppressWarnings("unused") 
        long id; 
        String selection = getResources().getStringArray(R.array.markslist)[which]; 
        id = db.insertMark(date, "Default", selection); 
        } 
      }) 
      .show(); 
     getData(); 
     break; 
    case R.id.menu_delete: 
      //Deleting function yet to be implemented. 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

संपादित करें: सूची: के बाद से यह होने के लिए एंड्रॉयड था ListView आईडी गलत था।

उत्तर

53

कुछ SimpleCursorAdapter ट्यूटोरियल की कोशिश करो। अब मान लें कि आप एक ListView में हर शीर्षक प्रदर्शित करना चाहते हैं:

db = new DBAdapter(this); 
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, 
     db.getAllTitles(), 
     new String[] { "title" }, 
     new int[] { android.R.id.text1 }); 

ListView listView = (ListView) findViewById(R.id.list); 
listView.setAdapter(adapter); 

(आप कर्सर खुद के माध्यम से लूप की जरूरत नहीं है, एक एडाप्टर आप के लिए यह काम करता है!)

पिछले दो आपके SimpleCursorAdapter कन्स्ट्रक्टर में पैरामीटर वे हैं जो आप गायब हैं। वे "से" और "करने के लिए" पैरामीटर:

  • हम प्रत्येक पुस्तक के स्तंभ नाम title में संग्रहित है के नाम पर प्राप्त करना चाहते हैं, यह वह जगह है जहाँ हम जानकारी "से" मिलता है।
  • अगला हमें यह कहने की जरूरत है कि "कहां" जाना है: android.R.id.text1android.R.layout.simple_list_item_1 लेआउट में एक टेक्स्ट व्यू है। (आप अपने एसडीके के माध्यम से खुदाई कर सकते हैं और अपने आप को simple_list_item_1.xml फ़ाइल या बस पल के लिए मुझ पर भरोसा देखें।)

अब दोनों "से" और "के लिए" पैरामीटर सरणियों हैं क्योंकि हम एक से अधिक पारित कर सकते हैं

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_2, 
     db.getAllTitles(), 
     new String[] { "title", "publisher" }, 
     new int[] { android.R.id.text1, android.R.id.text2 }); 
इस एडाप्टर अपने डाटाबेस में किताबें शीर्षक द्वारा प्रदर्शित होगी, तो प्रकाशक के साथ

सूचना के स्तंभ, इस अनुकूलक के साथ-साथ प्रयास करें। हमें बस इतना करना था कि एक लेआउट android.R.layout.simple_list_item_2 का उपयोग करें जो दो फ़ील्ड लेता है और परिभाषित करता है कि कौन से कॉलम टेक्स्ट व्यू पर जाते हैं।

मुझे आशा है कि थोड़ा सा मदद मिलेगी। सीखने के लिए बहुत कुछ है लेकिन शायद यह आपको कुछ मूलभूत बातें देगा।


अंतिम टिप्पणी

मेरे सिर के ऊपर बंद, नए आंकड़ों को जोड़ने के बाद ListView ताज़ा करने का प्रयास करें:

public void onClick(DialogInterface dialog, int which) { 
    String selection = getResources().getStringArray(R.array.markslist)[which]; 
    db.insertMark(date, "Default", selection); 
    cursor.requery(); 
    adapter.notifyDataSetChanged(); 
} 

आप adapter को परिभाषित करने और एक बनाना होगा cursor के लिए परिवर्तनीय लेकिन यह आसान है:

public class Marks extends ListActivity { 
    SimpleCursorAdapter adapter; 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    ... 

और GetData (बदलें) तदनुसार:

private void getData() { 
    cursor = db.getAllMarks(); 
    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      cursor, 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 
    ... 
} 

गुड लक!

+0

धन्यवाद। मुझे लगता है कि मैं समझता हूं, आप क्या समझाने की कोशिश कर रहे हैं। मैंने आपके एडाप्टर का उपयोग किया लेकिन मुझे अभी भी एक अपवाद मिलता है जो मेरे ऐप को क्रैश करता है। मुझे लगता है कि त्रुटि कहीं और है? – BlueHazard

+0

लॉगकैट कॉपी और पेस्ट करें (अपने प्रश्न के निचले बाएं हिस्से में संपादन लिंक का उपयोग करें)। मैं एक नजर मार लूगां। जब आपने यह किया है तो मुझे एक टिप्पणी में टैग करें ("@ सैम" के साथ)। – Sam

+0

मैंने अपने प्रश्न में लॉगकैट जोड़ा। मेरी सहायता करने के लिए धन्यवाद। – BlueHazard

0

कर्सर में प्रत्येक आइटम पर एक एडाप्टर का उपयोग नहीं किया जाता है, पूरे कर्सर के लिए एक एडाप्टर बनाया जाता है। आप इस कर्सर का उपयोग करने के लिए इस सूचीदृश्य को सेट कर सकते हैं। ट्यूटोरियल है कि आप करने के लिए, हर पंक्ति है एक _id, isbn, title, और publisher जुड़ा हुआ में डेटाबेस प्रारूप का उपयोग की तरह this

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