SQLite in ListView anzeigen

  • Antworten:11
P.K.
  • Forum-Beiträge: 6

03.05.2012, 15:17:08 via Website

Hallo Forum,

ich habe die letzten Wochen damit verbracht mir das Android-Programmieren beizubringen, größtenteils sogar mit Erfolg :)

Leider hat mir weder Google noch die Forensuche bei meinem Problem geholfen, wahrscheinlich weil ich nicht mal weiß, wo ich ansetzen soll.

Meine App berechnet jedenfalls etwas und schreibt das auch schon in eine Datenbank, soweit so gut:
Die Datensätze (sind nur 3 Werte pro Datensatz) möchte ich gerne auf der ersten Activity (also main) ordentlich aufgelistet haben, am besten noch mit Löschfunktion.

Ich habe aber keine Idee, wo ich was implementieren muss um auf die DB zuzugreifen.
Wenn keiner was dagegen hat, dann poste ich mal schnell meinen Code:

Hier erstmal meine Datenbank-Helferklasse

1package de.rduke.parzellenvermessung;
2
3import android.content.Context;
4import android.database.sqlite.SQLiteDatabase;
5import android.database.sqlite.SQLiteOpenHelper;
6
7public class Database_Manager extends SQLiteOpenHelper {
8 private static final String DATABASE_NAME = "parzellen.db";
9 public static final String INFO = "info";
10 public static final String FLAECHE = "flaeche";
11 public static final String STEIGUNG = "steigung";
12 public Database_Manager(Context context) {
13 super(context, DATABASE_NAME, null, 1);
14 }
15
16 @Override
17 public void onCreate(SQLiteDatabase db) {
18 db.execSQL( "CREATE TABLE parzellen (_id INTEGER PRIMARY KEY AUTOINCREMENT,info TEXT, flaeche TEXT,steigung TEXT);");
19 }
20
21 @Override
22 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
23 android.util.Log.w("parzellen",
24 "Upgrading database, which will destroy all old data");
25 db.execSQL("DROP TABLE IF EXISTS parzellen");
26 onCreate(db);
27 }
28}

Nun die Klasse, in der die Berechnungen gemacht werden. Die Berechnungen lasse ich mal weg und beschränke mich auf die Funktion, die auf die DB zugreift:
1void db_save(String info, double flaeche, double steigung) {
2
3 String flaeche_s=String.valueOf(flaeche);
4 String steigung_s=String.valueOf(steigung);
5 Database_Manager dbmanager=new Database_Manager(this);
6 SQLiteDatabase db = dbmanager.getWritableDatabase();
7 ContentValues cv= new ContentValues();
8 cv.put(dbmanager.INFO, info);
9 cv.put(dbmanager.FLAECHE, flaeche_s);
10 cv.put(dbmanager.STEIGUNG, steigung_s);
11 db.insert("parzellen", dbmanager.INFO, cv);
12 db.close();
13 }

In der Main hätte ich jetzt gerne eine ListView, die mir die Datensätze (sofern vorhanden) anzeigt. Leider bin ich nach dem ganzen Coden jetzt mit meinem Latein am Ende und weiß nicht mal wo ich ansetzen soll.

Zu guter Letzt noch meine Main wo alles rein soll:
1package de.rduke.parzellenvermessung;
2
3import android.app.Activity;
4import android.content.Intent;
5
6import android.os.Bundle;
7import android.view.View;
8
9public class ParzellenVermessungActivity extends Activity {
10 /** Called when the activity is first created. */
11
12 public void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14
15 setContentView(R.layout.main);
16
17 }
18
19 public void wechsleActivity(final View view) {
20
21 Intent my_intent = new Intent(this, Active_measurement.class);
22 startActivity(my_intent);
23
24 }
25
26}

Ich danke schonmal im Voraus dafür, dass sich vielleicht jemand meinem Problem annimmt und mir Tips gibt.

Viele Grüße

Philipp

— geändert am 03.05.2012, 15:18:39

Antworten
Tanja Z.
  • Forum-Beiträge: 52

03.05.2012, 16:57:06 via Website

Du benötigst einen SimpleCursorAdapter, um die ListView mit den Daten aus der DB zu füllen und wahrscheinlich auch einen ViewBinder um die Daten nach Deinen Wünschen anzuordnen und statt "extends Activity" = "extends ListActivity" angeben.


Gruß, Tanja

— geändert am 03.05.2012, 16:58:09

Antworten
P.K.
  • Forum-Beiträge: 6

03.05.2012, 18:15:19 via Website

Wenn ich extends ListActivity mache bekomme ich direkt einen force close.
Muss ich für die ListView eine ganz neue Klasse erstellen? Ich dachte das könnte ich direkt in die Activity einbauen. Sorry, falls ich auf dem Schlauch stehe.

Antworten
Tanja Z.
  • Forum-Beiträge: 52

03.05.2012, 18:53:35 via Website

Nein, Du erweiterst die Klasse, in der Du die ListView haben möchtest, einfach mit extends ListActivity. Kopier doch bitte die Fehlermeldung aus der LogCat, daraus kann man sehen, warum die App abstürzt.

Antworten
P.K.
  • Forum-Beiträge: 6

03.05.2012, 19:03:03 via Website

Danke Dir schonmal.

Also in meiner Haupt-Activity, also der Java Datei die auf das Main-Layout verweist habe ich folgendes geändert:
1public class ParzellenVermessungActivity extends Activity {
2 /** Called when the activity is first created. */
3
4 public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);

und "extends Activity" in "extends ListActivity" geändert (und natürlich an den Import gedacht)


Hier der LogCat-AUszug:

105-03 16:58:57.562: E/AndroidRuntime(479): FATAL EXCEPTION: main
205-03 16:58:57.562: E/AndroidRuntime(479): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.rduke.parzellenvermessung/de.rduke.parzellenvermessung.ParzellenVermessungActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
305-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
405-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
505-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
605-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
705-03 16:58:57.562: E/AndroidRuntime(479): at android.os.Handler.dispatchMessage(Handler.java:99)
805-03 16:58:57.562: E/AndroidRuntime(479): at android.os.Looper.loop(Looper.java:130)
905-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread.main(ActivityThread.java:3683)
1005-03 16:58:57.562: E/AndroidRuntime(479): at java.lang.reflect.Method.invokeNative(Native Method)
1105-03 16:58:57.562: E/AndroidRuntime(479): at java.lang.reflect.Method.invoke(Method.java:507)
1205-03 16:58:57.562: E/AndroidRuntime(479): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
1305-03 16:58:57.562: E/AndroidRuntime(479): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
1405-03 16:58:57.562: E/AndroidRuntime(479): at dalvik.system.NativeStart.main(Native Method)
1505-03 16:58:57.562: E/AndroidRuntime(479): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
1605-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ListActivity.onContentChanged(ListActivity.java:243)
1705-03 16:58:57.562: E/AndroidRuntime(479): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:210)
1805-03 16:58:57.562: E/AndroidRuntime(479): at android.app.Activity.setContentView(Activity.java:1657)
1905-03 16:58:57.562: E/AndroidRuntime(479): at de.rduke.parzellenvermessung.ParzellenVermessungActivity.onCreate(ParzellenVermessungActivity.java:20)
2005-03 16:58:57.562: E/AndroidRuntime(479): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
2105-03 16:58:57.562: E/AndroidRuntime(479): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)




Angeblich fehlt eine ListView mit der id R.id.list.
Das verstehe ich nicht. Meine ListView "heißt" lv_parzellen, der Name kann doch frei gewählt werden!?
Danke für deine Geduld, ich fürchte ich stehe nur dick auf dem Schlauch :)

— geändert am 03.05.2012, 19:07:33

Antworten
Tanja Z.
  • Forum-Beiträge: 52

03.05.2012, 19:21:20 via Website

In Deiner main.xml bzw. das Layout, das für die ListActivity verwandt wird, benötigt, noch die ListView, z.B.

<ListView android:id="@+id/android:list" android:layout_width="fill_parent"
android:layout_height="0dp" android:textFilterEnabled="true"
android:layout_weight="1"
android:cacheColorHint="#00000000"
android:background="@color/hellblau"
android:scrollbars="vertical" />

Gruß, Tanja

Antworten
P.K.
  • Forum-Beiträge: 6

03.05.2012, 19:26:17 via Website

Hallo Tanja,

ich hatte in der Main.xml schon eine ListView, aber mit anderer ID:

1<ListView
2 android:id="@+id/lv_parzellen"
3 android:layout_width="match_parent"
4 android:layout_height="wrap_content"
5 >
6
7 </ListView>

Warum muss das die id android:list haben?

Antworten
Tanja Z.
  • Forum-Beiträge: 52

03.05.2012, 21:57:17 via Website

Die ListActivity benötigt diese id, um auf die ListView im layout zugreifen zu können.

Gruß,

Tanja

— geändert am 03.05.2012, 21:58:27

Antworten
P.K.
  • Forum-Beiträge: 6

03.05.2012, 22:00:14 via Website

Also jetzt nochmal zu meinem Verständnis:

Ich gebe der ListView statt der id "lv_parzelle" die id "android:list"
Wenn ich später auf die Liste zugreifen will rufe ich diese auf mit R.id.list ? (also alles wie gehabt)

Gut, dann danke ich mal recht höflich. Da wäre ich im Leben nicht drauf gekommen, dass die id von ner ListView keine freie id-Wahl zulässt.

Antworten
Florian B.
  • Forum-Beiträge: 284

03.05.2012, 22:37:59 via Website

P.K.
Da wäre ich im Leben nicht drauf gekommen, dass die id von ner ListView keine freie id-Wahl zulässt.

Nicht die ListView setzt das voraus, sondern die ListAcitvity. Die sucht automatisch nach einer ListView mit dieser Id. Wenn du die ganz Funktionalität für das Handln einer Liste selber in der Activity implementierst ohne von ListActivity zu erben, dann kannst du die Id wählen wie du willst. Die ListActivity nimmt aber eben ein Haufen Arbeit ab.

Antworten
P.K.
  • Forum-Beiträge: 6

03.05.2012, 22:39:37 via Website

aaah, ok, got it :) Danke Tanja + Florian.

Ich werde demnächst mal berichten wie es lief!

Antworten
Felix
  • Forum-Beiträge: 259

03.05.2012, 22:46:03 via Website

Tach!

P.K.
Ich gebe der ListView statt der id "lv_parzelle" die id "android:list"
Wenn ich später auf die Liste zugreifen will rufe ich diese auf mit R.id.list ? (also alles wie gehabt)

Durch das Umstallen von einer einfachen Activity auf eine ListActivity bekommst du nicht nur die Pflicht, dich an ein paar Konventionen zu halten (ID der Listview) sondern auch noch ein paar zusätzliche Möglichkeiten frei Haus geliefert. Die Methode getListView() ist eine davon.

Gut, dann danke ich mal recht höflich. Da wäre ich im Leben nicht drauf gekommen, dass die id von ner ListView keine freie id-Wahl zulässt.

Wenn du sie frei verwendest, dann schon, aber nicht im Zusammenhang mit der ListActivity. Bitte konsultiere stets die Dokumentation zu den von dir eingesetzten Dingen, auch und gerade wenn sie dir von anderen empfohlen werden.


Felix.

San Blarnoi

Antworten