2012-08-22 25 views
16

Veri depolamak ve ondan okumak için bir veritabanı kullanması gereken bir android uygulaması programlıyorum. this tutorial (on archive.org) kullanarak Ben bir veritabanı oluşturmak için app var ve yeni girişler oluşturmak mümkün, ancak, ben bir ListView saklanan verileri almak için veritabanını okumak için nasıl bilmiyorum. Bu web sitesinde pek çok benzer soru olduğunu biliyorum, ancak bunların hiçbiri başvuru için geçerli değil.Android: Veritabanından DataView'a erişmek için SimpleCursorAdapter'ı kullanma

Kodu:

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); 
} 
} 

Düzenleme: listesi: o android olmak zorundaydı çünkü ListView kimliği yanlıştı.

cevap

53

gibi bazı SimpleCursorAdapter öğreticiler deneyin. Şimdi bir ListView her başlık görüntülemek istediğiniz varsayalım:

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); 

(Sen İmleç kendin döngü gerekmez, bir adaptör sizin için bu işi yapar!)

son iki SimpleCursorAdapter yapıcınızdaki parametreler eksik olanlardır. Biz "den" bilgiyi nereden

  • Biz sütun adının title depolanır her kitabın adını almak istiyorum şudur: Onlar "dan" parametreler "dan" ve.
  • Sonraki "to" nereye gideceğini söylemeliyiz: android.R.id.text1, android.R.layout.simple_list_item_1 düzenindeki bir TextView'dir. Biz birden fazla geçebilir çünkü parametreler dizilerdir "dan" (SDK'nıza kazmak ve simple_list_item_1.xml dosyayı kendiniz ya da sadece an için bana güven bkz. edebilirsiniz) "dan" Artık hem

ve bilginin sütun yanı bu adaptörü deneyin: kendi veritabanında kitaplar başlığı tarafından görüntülenen bu adaptör, ardından yayıncı ile

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 }); 

. Tek yapmamız gereken, iki alanı alan ve hangi sütunların hangi TextView'lere gideceğini tanımlayan bir düzen android.R.layout.simple_list_item_2 kullanıyor.

Umarım biraz yardımcı olur. Öğrenecek çok şey var ama belki bu size bazı temel bilgiler verecektir.

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

Sen adapter tanımlayıp oluşturmanız gerekir: başımın üstünde Off Son Yorum


, yeni veri ekledikten sonra ListView yenilemek için bu deneyin değişken cursor için ama bu basit:

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

Ve buna göre) getData (değiştirin:

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 }); 
    ... 
} 

İyi şanslar!

+0

Teşekkür ederiz. Anladım, ne anlatmaya çalışıyorsun. Bağdaştırıcınızı kullandım ancak uygulamanızı çökerten bir istisna yapıyorum. Hatanın başka bir yerde olduğunu mu varsayıyorum? – BlueHazard

+0

LogCat'i kopyalayıp yapıştırın (sorunuzun sol altındaki düzenleme bağlantısını kullanın). Bir bakacağım. Bunu yaptığınızda bir yorumda ("@Sam" ile) beni etiketleyin. – Sam

+0

LogCat’ı soruma ekledim. Bana yardım ettiğin için teşekkürler. – BlueHazard

0

İmlecin her öğesinde bir bağdaştırıcı kullanılmaz, tüm imleç için bir bağdaştırıcı oluşturulur. Bu imleci kullanmak için bu liste görünümünü ayarlayabilirsiniz. Eğer, her satır bir _id, isbn, title ve publisher sahiptir bağlantılı öğretici veritabanı biçiminin kullanılması this