Problem mit DB verbdindung

  • Antworten:4
Johannes
  • Forum-Beiträge: 49

07.11.2011, 23:41:35 via Website

Hey Leute,
ich habe gerade versucht mir eine DB verbindung herzustellen... leider ohne erfolg, ich bekomm immer ne exception und das logcat bring mich auch net weiter.. vllt habt ihr ja ne idee!

das ist mein SQLiteOpenHelper
1package com.AndroidTest1;
2
3import android.content.Context;
4import android.database.sqlite.SQLiteDatabase;
5import android.database.sqlite.SQLiteOpenHelper;
6import android.util.Log;
7
8public class MyDBHelper extends SQLiteOpenHelper {
9 private static final String DATABASE_NAME = "dbShopper";
10 private static final String DATABASE_TABLE_ALL = "tbl_all";
11 private static final int DATABASE_VERSION = 1;
12
13 // Database creation sql statement
14 private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE_ALL +
15 "(_id INTEGER primary key autoincrement, " +
16 "anzahl INTEGER, " +
17 "einheit TEXT, " +
18 "beschreibung TEXT not null, " +
19 "preis REAL);";
20
21 public MyDBHelper(Context context) {
22 super(context, DATABASE_NAME, null, DATABASE_VERSION);
23 }
24
25 // Method is called during creation of the database
26 @Override
27 public void onCreate(SQLiteDatabase database) {
28 database.execSQL(DATABASE_CREATE);
29 }
30
31 // Method is called during an upgrade of the database, e.g. if you increase
32 // the database version
33 @Override
34 public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
35 Log.w(MyDBHelper.class.getName(),
36 "Upgrading database from version " + oldVersion + " to "
37 + newVersion + ", which will destroy all old data");
38 database.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_ALL);
39 onCreate(database);
40 }
41}

und so versuch ich dann ihn innerhalb von einem eigenen ArrayAdapter zu benutzen:

1package com.AndroidTest1;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import android.R.string;
7import android.app.Activity;
8import android.content.ContentValues;
9import android.database.Cursor;
10import android.database.SQLException;
11import android.database.sqlite.SQLiteDatabase;
12import android.view.LayoutInflater;
13import android.view.View;
14import android.view.View.OnClickListener;
15import android.view.ViewGroup;
16import android.widget.ArrayAdapter;
17import android.widget.CheckBox;
18import android.widget.TextView;
19import android.widget.Toast;
20
21
22
23public class CustomArrayAdapter extends ArrayAdapter<Model> {
24
25 // Database fields
26 public static final String KEY_ROWID = "_id";
27 public static final String KEY_ANZAHL = "anzahl";
28 public static final String KEY_EINHEIT = "einheit";
29 public static final String KEY_BESCHREIBUNG = "beschreibung";
30 public static final String KEY_PREIS = "beschreibung";
31 private static final String DATABASE_TABLE_NAME = "tbl_all";
32
33 private final List<Model> list;
34 public final Activity context;
35 private SQLiteDatabase database;
36 private MyDBHelper dbHelper;
37
38 public CustomArrayAdapter(Activity context, List<Model> list) {
39 super(context, R.layout.list_item, list);
40
41 try {
42 this.open();
43 } catch (Exception e) {
44 Toast.makeText(context, "db open fehler", 100);
45 }
46
47 //fillDB(list);
48 this.context = context;
49 this.list = list;
50 }
51
52 @Override
53 public View getView(int position, View convertView, ViewGroup parent) {
54 XXXX
55 }
56
57 public OnClickListener myClickListener = new OnClickListener()
58 {
59 public void onClick(View v)
60 {
61 create(20, "stk", "eier", 10); ///HIER BEKOMME ICH DEN FEHLER!!
62 }
63 };
64
65
66
67 //DB FUNCTIONS
68
69 public boolean open() throws SQLException {
70 dbHelper = new MyDBHelper(context);
71 database = dbHelper.getWritableDatabase();
72 return true;
73 }
74
75
76 public long create(int anzahl, String einheit, String beschreibung, float preis) {
77 ContentValues initialValues = createContentValues(anzahl, einheit, beschreibung, preis);
78
79 return database.insert(DATABASE_TABLE_NAME, null, initialValues);
80 }
81
82
83 private ContentValues createContentValues(int anzahl, String einheit, String beschreibung, float preis) {
84 ContentValues values = new ContentValues();
85 values.put(KEY_ANZAHL, anzahl);
86 values.put(KEY_EINHEIT, einheit);
87 values.put(KEY_BESCHREIBUNG, beschreibung);
88 values.put(KEY_PREIS, preis);
89
90 return values;
91 }
92}


so noch die logCat ausgabe:
11-07 22:40:47.357: DEBUG/AndroidRuntime(467): Shutting down VM
11-07 22:40:47.366: WARN/dalvikvm(467): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
11-07 22:40:47.386: INFO/Process(52): Sending signal. PID: 467 SIG: 3
11-07 22:40:47.386: INFO/dalvikvm(467): threadid=7: reacting to signal 3
11-07 22:40:49.186: INFO/Process(467): Sending signal. PID: 467 SIG: 9
11-07 22:40:49.206: INFO/ActivityManager(52): Process com.AndroidTest1 (pid 467) has died.
11-07 22:40:49.206: INFO/WindowManager(52): WIN DEATH: Window{44d91468 com.AndroidTest1/com.AndroidTest1.actAdmin paused=false}
11-07 22:40:49.236: INFO/UsageStats(52): Unexpected resume of com.android.launcher while already resumed in com.AndroidTest1
11-07 22:40:49.276: WARN/InputManagerService(52): Got RemoteException sending setActive(false) notification to pid 467 uid 10028


vielen dank schomal!!

Antworten
Gian U.
  • Forum-Beiträge: 117

08.11.2011, 16:49:35 via Website

Hallo

Ich denke, dass das der falsche Ausschnitt aus der LogCat ist, denn normalerweise bekommt man Angaben darüber, was für ein Fehler wo passiert ist.

Ändere diesen Abschnitt

1try {
2this.open();
3} catch (Exception e) {
4Toast.makeText(context, "db open fehler", 100);
5}

EDIT: Toast.makeText noch abgeändert

bitte in

1try {
2this.open();
3} catch (Exception e) {
4Log.e("AndroidTest1", "", e);
5Toast.makeText(context, "db open fehler", Toast.LENGTH_SHORT).show();
6}

Dann bekommst du wahrscheinlich die vollen Ausgaben

— geändert am 08.11.2011, 16:53:59

Mnemono - Efficient learning!

Antworten
Johannes
  • Forum-Beiträge: 49

09.11.2011, 12:56:41 via Website

ups du hast recht, der fehler ist schon beim öffnen!

und ich habs gefixt! habe den context später erst zugewiesen... :((

ok also das create funktioniert jetzt! aber wie kann ich das jetzt wieder ausgeben lassen, bzw sehen ob etwas in der DB ist??

ich habs mal so probiert:

hab da die methode:
1public Cursor fetchAll() {
2 return database.query(MyDBHelper.DATABASE_TABLE_ALL, new String[] { KEY_ROWID,
3 KEY_ANZAHL, KEY_EINHEIT, KEY_BESCHREIBUNG, KEY_PREIS }, null, null, null,
4 null, null);
5 }

und die ruf ich dann folgendermaßen auf:
Cursor cursor = fetchAll();
cursor.getString(1);

aber irgendwie macht er mir das nicht :((

als fehler gibt er mir:
11-09 12:25:48.576: ERROR/AndroidRuntime(423): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.AndroidTest1.CustomArrayAdapter$1.onClick(CustomArrayAdapter.java:107)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.View.performClick(View.java:2364)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.View.onTouchEvent(View.java:4179)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.View.dispatchTouchEvent(View.java:3709)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.os.Handler.dispatchMessage(Handler.java:99)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.os.Looper.loop(Looper.java:123)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at android.app.ActivityThread.main(ActivityThread.java:4363)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at java.lang.reflect.Method.invokeNative(Native Method)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at java.lang.reflect.Method.invoke(Method.java:521)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-09 12:25:48.576: ERROR/AndroidRuntime(423): at dalvik.system.NativeStart.main(Native Method)
11-09 12:25:48.586: ERROR/dalvikvm(423): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
11-09 12:25:50.346: ERROR/JavaBinder(52): !!! FAILED BINDER TRANSACTION !!!

aber warum: CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5??
ich greife doch gar nicht mit nem index von -1 drauf zu.... und diese size heißt dann wieviel inhalte in der tabelle sind?

— geändert am 09.11.2011, 13:27:36

Antworten
Gian U.
  • Forum-Beiträge: 117

09.11.2011, 14:17:00 via Website

Also, um einen Cursor auszulesen kannst du z.B. folgenden Code verwenden:

1private void getColumnData(Cursor cur){
2 if (cur.moveToFirst()) {
3
4 int rowId, anzahl;
5 double preis;
6 String einheit, beschreibung;
7
8 do {
9 // Get the field values
10 rowId = cur.getInt(cur.getColumnIndex(KEY_ROWID);
11 anzahl = cur.getInt(cur.getColumnIndex(KEY_ANZAHL);
12 einheit = cur.getString(cur.getColumnIndex(KEY_EINHEIT);
13 beschreibung = cur.getString(cur.getColumnIndex(KEY_BESCHREIBUNG);
14 preis = cur.getDouble(cur.getColumnIndex(KEY_PREIS);
15
16 // Do something with the values.
17 ...
18
19 } while (cur.moveToNext());
20
21 }
22}

(Abgeändert von http://developer.android.com/guide/topics/providers/content-providers.html)

Ich hoffe es hilft dir!

Gian

EDIT: Das Problem in deiner Methode ist, das der Index am Anfang auf -1 gesetzt ist, damit man Cursor.moveToNext() aufrufen kann. Du liest mit deinem Code den Wert der "minus-einten" Zeile aus, was ja nicht geht.

— geändert am 09.11.2011, 14:22:34

Mnemono - Efficient learning!

Antworten
Johannes
  • Forum-Beiträge: 49

09.11.2011, 15:27:23 via Website

ahh ok super!! vielen dank!!!!!

ich bekomm schon werte raus, auch wenn ich ein bisschen pfusch betrieben habe beim einfügen von werten... wie kann ich mir denn jetzt die tabelle mal in nem db-explorer anschauen? und ggf auch mal bearbeiten/löschen?

Antworten