2012-08-22 9 views
16

Programuję aplikację na Androida, która powinna używać bazy danych do przechowywania danych i odczytu z niej. Korzystając z usługi this tutorial (on archive.org) otrzymałem aplikację do utworzenia bazy danych i jestem w stanie utworzyć nowe wpisy, jednak nie wiem, jak odczytać bazę danych, aby uzyskać zapisane dane w widoku listy. Wiem, że na tej stronie jest wiele podobnych pytań, ale wygląda na to, że żaden z nich nie dotyczy drogi, bazy danych z tutoriala.Android: Używanie SimpleCursorAdapter do pobierania danych z bazy danych do ListView

Kod:

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

Edit: Identyfikator ListView był niewłaściwy, ponieważ musiała być android: lista.

Odpowiedz

53

Korzystanie format bazy danych w samouczku, że związane, każdy wiersz ma _id, isbn, title i publisher. Teraz załóżmy, że chcesz wyświetlić każdy tytuł w 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); 

(Nie trzeba do pętli poprzez samemu kursorem, adapter to działa dla Ciebie!)

Dwa ostatnie parametry w konstruktorze SimpleCursorAdapter są tym, czego brakuje. Są one „od” i „do” Parametry:

  • Chcemy uzyskać nazwę każdej książki, która jest przechowywana w nazwę kolumny title, to gdzie możemy uzyskać informacje „z”.
  • Następnie musimy powiedzieć, gdzie "iść": android.R.id.text1 to TextView w układzie android.R.layout.simple_list_item_1. (Można kopać pośrednictwem SDK i zobaczyć simple_list_item_1.xml złożyć samodzielnie lub po prostu zaufaj mi w tym momencie.)

Teraz zarówno „z” i „do” parametry są tablice, ponieważ możemy przekazać więcej niż jeden kolumna informacji, spróbuj tego zasilacza, a także:

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

dzięki adapterowi książki w swojej bazie danych będzie wyświetlany przez tytuł, a następnie wydawcy. Wszystko, co musieliśmy zrobić, to użyć układu android.R.layout.simple_list_item_2, który pobiera dwa pola i definiuje kolumny, do których prowadzą TextViews.

Mam nadzieję, że to trochę pomaga. Jest jeszcze wiele do nauczenia się, ale może to da ci podstawy.


Ostatni komentarz

Off szczycie mojej głowy, aby odświeżyć ListView po dodaniu nowych danych spróbuj tego:

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

Musisz określić adapter i utworzyć zmienna dla cursor, ale to proste:

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

I zmienić getData() odpowiednio:

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

Powodzenia!

+0

Dziękuję. Myślę, że dostaję, co próbujesz wyjaśnić. Użyłem twojego adaptera, ale wciąż dostaję wyjątek, który powoduje awarię mojej aplikacji. Zakładam, że błąd jest gdzie indziej? – BlueHazard

+0

Skopiuj i wklej LogCat (użyj linku edycji w lewym dolnym rogu twojego pytania). Spojrzę na to. Opisz mnie w komentarzu (przy pomocy "@Sam"), gdy już to zrobisz. – Sam

+0

Dodałem LogCat do mojego pytania. Dziękuję za pomoc. – BlueHazard

0

Adapter nie jest używany dla każdej pozycji kursora, dla całego kursora tworzony jest jeden adapter. Możesz ustawić ten widok listy, aby użyć tego kursora. Spróbuj kilka tutoriali SimpleCursorAdapter jak this

Powiązane problemy