Problem beim auslesen einer Datenbank

  • Antworten:4
Yorrick R.
  • Forum-Beiträge: 60

18.12.2011, 15:18:11 via Website

Hallo Leute,

ich beschäftige mich momentan mit dem Thema Datenbanken in Android. Deshalb habe ich mir eine kleine App programmiert in welche man über eine Activity die Daten eingibt und über eine zweite die Daten in einer ListActiviy angezeigt bekommt. Nun bin ich schon soweit das ich eine Ausgabe bekomme, nur dummerweise bekomme ich nur die Rückgabe von cursor.getColumnIndex() oder cursor.getColumnName() mal die Anzahl der vorhandenen Einträge hin. Aber ich stehe gerade total auf dem Schlauch, wie ich den Inhalt einer Tabelle wieder raus bekomme.
Dabei versuche ich momentan nur einen Wert, zB.: aus TEST_DATUM in ein TextView zu schreiben.

Kann mir da jemand helfen bzw. erklären wie es richtig funktioniert oder einen Link zu einem guten Tutorial geben? Google spuckt mir leider nichts passendes aus.

Hier mal mein gesamter dafür nötiger Code:
Ich habe die Logs mal drinnen gelassen, damit die Orientierung beim Ablauf besser ist.
(Gibt es im Forum eigentlich eine Spoilerfunktion? Dann nimmt der Quellcode nicht so viel Platz weg...)

Anzeigen.java
1package com.yorrickr.dashboard;
2
3import android.app.ListActivity;
4import android.database.Cursor;
5import android.os.Bundle;
6import android.util.Log;
7
8public class Anzeigen extends ListActivity {
9
10 // Schnittstelle zur Datenbank
11 private DatenbankHandler dbHandler;
12 // wird für die Listenansicht benötigt
13 private Cursor dbCursor;
14 // bildet den Cursor auf die ListView ab
15 private Datenbank11Adapter listAdapter;
16 private static final String TAG = Anzeigen.class.getSimpleName();
17
18
19 @Override
20 public void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 Log.i(TAG, " Anzeigen gestartet.");
23 dbHandler = new DatenbankHandler(this);
24 dbCursor = dbHandler.query();
25 Log.i(TAG, "Cursor wurde initiiert");
26 startManagingCursor(dbCursor);
27 Log.i(TAG, "startManagingCursor");
28 listAdapter = new Datenbank11Adapter(this, dbCursor);
29 Log.i(TAG, "listAdapter inintiiert");
30 setListAdapter(listAdapter);
31 Log.i(TAG, "setListAdapter");
32
33 }
34
35 @Override
36 public void onDestroy() {
37 super.onDestroy();
38 Log.i(TAG, "onDestroy()");
39 dbHandler.close();
40 }
41
42 private void updateList() {
43 // zunächst Cursor, dann Liste aktualisieren
44 Log.i(TAG, "updateList gestartet");
45 dbCursor.requery();
46 listAdapter.notifyDataSetChanged();
47 }
48}

DatenbankHandler.java
1package com.yorrickr.dashboard;
2
3import android.content.ContentValues;
4import android.content.Context;
5import android.database.Cursor;
6import android.database.sqlite.SQLiteDatabase;
7import android.database.sqlite.SQLiteException;
8import android.database.sqlite.SQLiteOpenHelper;
9import android.util.Log;
10import android.widget.Toast;
11
12public class DatenbankHandler extends SQLiteOpenHelper {
13
14 //private static final String r = "SELECT * FROM TEST_DATUM";
15 private static final String TAG = DatenbankHandler.class.getSimpleName();
16
17 //Name und Version der Datenbank
18 private static final String DATABASE_NAME = "testbank.db";
19 private static final int DATABASE_VERSION = 1;
20
21 //Name und Attribute der Tabelle "vertretungsplan"
22 private static final String _ID = "_id";
23 private static final String TABLE_NAME_TEST = "test1";
24 static final String TEST_DATUM = "datum";
25 public static final String TEST_STUNDE = "stunde";
26 private static final String TEST_FACH = "fach";
27 private static final String TEST_RAUM1= "raum1";
28 private static final String TEST_RAUM2= "raum2";
29 private static final String TEST_MERKMAL = "merkmal";
30 private static final String TEST_INFO = "info";
31
32 //Tabelle "test" anlegen
33 private static final String TABLE_TEST_CREATE = " CREATE TABLE "+ TABLE_NAME_TEST + " ( " + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
34 + TEST_DATUM + " STRING, " + TEST_STUNDE + " STRING, " + TEST_FACH + " STRING, "
35 + TEST_RAUM1 + " STRING, " + TEST_RAUM2 + " STRING, " + TEST_MERKMAL + " STRING, " + TEST_INFO + " STRING ); ";
36
37 //Tabelle "test" löschen
38 private static final String TABLE_TEST_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME_TEST;
39
40/* protected void toast(){
41 Toast.makeText(this, R.string.eingetragen, Toast.LENGTH_SHORT).show();
42 }*/
43
44 DatenbankHandler(Context context) {
45 super(context, DATABASE_NAME, null, DATABASE_VERSION);
46 Log.i(TAG, "DatenbankHandler wurde initiiert.");
47 }
48
49
50 @Override
51 public void onCreate(SQLiteDatabase db){
52 Log.i(TAG, "onCreate");
53 db.execSQL(TABLE_TEST_CREATE);
54 }
55
56 @Override
57 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
58 Log.w(TAG, "Upgraden der Datenbank von Version " + oldVersion + " zu Version " + newVersion + "; alle Daten werden gelöscht");
59 db.execSQL(TABLE_TEST_DROP);
60 onCreate(db);
61 }
62
63
64 public void insert(String datum, String stunde, String fach, String raum1, String raum2, String merkmal, String info){
65 long rowId = -1;
66 try {
67 //Datenbank öffnen
68 SQLiteDatabase db = getWritableDatabase();
69 //die zu speichernden Werte
70 ContentValues values = new ContentValues();
71 values.put(TEST_DATUM, datum);
72 values.put(TEST_STUNDE, stunde);
73 values.put(TEST_FACH, fach);
74 values.put(TEST_RAUM1, raum1);
75 values.put(TEST_RAUM2, raum2);
76 values.put(TEST_MERKMAL, merkmal);
77 values.put(TEST_INFO, info);
78 // in die Tabelle einfügen
79 rowId = db.insert(TABLE_NAME_TEST, null, values);
80 //toast();
81 } catch (SQLiteException e) {
82 Log.e(TAG, "insert()", e);
83 } finally {
84 Log.d(TAG, "insert(): rowId=" + rowId);
85 }
86
87 }
88
89 public Cursor query() {
90 Log.i(TAG, "Cursor query wird ausgeführt");
91 SQLiteDatabase db = getWritableDatabase();
92 return db.query(TABLE_NAME_TEST, null, null, null,
93 null, null, TEST_STUNDE + " DESC" );
94 }
95
96}

Datenbank11Adapter.java
1package com.yorrickr.dashboard;
2
3import android.content.Context;
4import android.database.Cursor;
5import android.util.Log;
6import android.view.LayoutInflater;
7import android.view.View;
8import android.view.ViewGroup;
9import android.widget.CursorAdapter;
10import android.widget.TextView;
11
12
13
14public class Datenbank11Adapter extends CursorAdapter {
15
16 private static final String TAG = DatenbankHandler.class.getSimpleName();
17
18 private int datum;
19 private String dat;
20 private LayoutInflater inflator;
21
22 public Datenbank11Adapter(Context context, Cursor c) {
23 super(context, c);
24 Log.i(TAG, "Datenbank11Adapter initiiert");
25 // TODO Auto-generated constructor stub
26 inflator = LayoutInflater.from(context);
27 Log.i(TAG, "inflator initiiert");
28 datum= c.getColumnIndex(DatenbankHandler.TEST_DATUM);
29 dat = c.getColumnName(datum);
30 Log.i(TAG, "datum initiiert");
31 }
32
33
34
35 @Override
36 public void bindView(View view, Context context, Cursor cursor) {
37 //dat = String.valueOf(datum);
38 Log.i(TAG, "bindView");
39 TextView textview1 = (TextView) view.findViewById(R.id.text1);
40 Log.i(TAG, "bindView2");
41 textview1.setText(dat);//FEHLER?
42 Log.i(TAG, "bindView3");
43 }
44
45 @Override
46 public View newView(Context context, Cursor cursor, ViewGroup parent){
47 Log.i(TAG, "newView");
48 return inflator.inflate(R.layout.datenbank11, null);
49 }
50
51}

Die zugehörige xml-File:
1<?xml version="1.0" encoding="utf-8"?>
2
3<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
4 android:layout_width="fill_parent"
5 android:layout_height="?android:attr/listPreferredItemHeight"
6 android:padding="6dip">
7
8
9 <TextView android:id="@+id/text1"
10 android:textAppearance="?android:attr/textAppearanceMedium"
11 android:layout_marginTop="4dip"
12 android:layout_width="fill_parent"
13 android:layout_height="wrap_content" />
14
15</RelativeLayout>

Eine kleine Datenbank habe ich hier hochgeladen:
http://www.megaupload.com/?d=ABMKWLXR

Ich habe diese mit einem kleinen Pythonscript geprüft, der Inhalt sollte so aussehen:
SELECT * FROM test1
1 1 1 11 1 11 1 1
2 12.12.2090 90
3 14.15.1999 3 deutsch 2 1 test dies ist ein test.
4 14.15.1990 41 deutsch 2 1 test dies ist ein test.
5 12 12 12 12 12 12 12
6 13 13 13 13 13 12 13
7 13 14 14 14 14 14 14
8 18.12.2011 7 Bio 1 test raum 2 ist leer.

Es wäre toll und ich bedanke mich schon mal dafür, wenn jemand die Zeit hat sich mal dadurch zu quälen.

Antworten
Stefan S.
  • Forum-Beiträge: 560

19.12.2011, 09:13:31 via Website

Erhälst du eine Fehlermeldung

Antworten
Yorrick R.
  • Forum-Beiträge: 60

19.12.2011, 17:35:26 via Website

Nein, so wie der Code momentan ist, bekomme ich mit c.getColumnName() bzw. c.getColumnIndex() und String.valueOf() einen String zurück geliefert der mir dann auch angezeigt wird mal die Anzahl der vorhandenen Datenbankeinträge. Was ich nicht hinbekomme und leider auch keine Tutorials dazu finde (wobei ich auch gerade erst aus der Schule zurück bin) ist, wie ich Einträge zurück bekomme (z.B.: "SELECT TEST_Datum FROM test1", wenn die Formulierung hier so korrekt ist) und sie mir in einer ListActivity richtig angezeigt werden... Mir würde bereits ein Link zu einem guten (auch englischsprachigen) Tutorial helfen, wenn ihr mir dazu auch nicht helfen könnt.

Ich weiß einfach nicht, wie ich das mache...

— geändert am 19.12.2011, 18:51:03

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

19.12.2011, 19:35:04 via App

Naja,
mit Cursor.moveNext() und ähnlichen Methoden bewegst du dich rauf und runter in der Tabelle und mit Cursor.getString(0) kriegst du dann z.B. den Inhalt der ersten Spalte als String.
Lg Ansgar

Antworten
Yorrick R.
  • Forum-Beiträge: 60

19.12.2011, 22:35:51 via Website

Danke! Über den Ansatz bin ich jetzt weiter gekommen. Hast mir sehr geholfen!

— geändert am 19.12.2011, 23:09:23

Antworten