Wie speichere ich am Besten die Daten meiner App und wo liegen die Standarddatenbanken?

  • Antworten:5
Jogu Du
  • Forum-Beiträge: 876

21.04.2014, 17:08:04 via Website

Hallo zusammen!

ich bin gerade dabei, mich in die Android App Programmierung einzuarbeiten. Als Hilfe nutze ich das Buch "Android-Apps programmieren" von Dirk Koller und bin gerade dabei die Beispielapp nachzuprogrammieren.

Dort wird gesagt das sich die Datenbank meiner App unter /data/data/PAKETNAME/databases befindet. Der Ordner data ist aber einfach leer. Um die Datenbanken zu entwerfen habe ich eine Klasse [1], die von SQLiteOpenHelper erbt. In dessen onCreate Methode habe ich dann mit db.execSQL("CREATE......") die Datenbanken definiert. Dann habe ich eine weitere Klasse [2] von Application abgeleitet und diese dann im Manifest eingetragen, sodass sie beim Start instanziiert wird. Darin erstelle ich eine Instanz der eben genannten Klasse, sodass deren onCreate Methode aufgerufen und somit die Datenbanken erstellt werden (sollten?).

Hier noch die beiden Klassen (Am Beispiel einer Tabelle):

[1]

    public class DatabaseHelper extends SQLiteOpenHelper{

    public DatabaseHelper(Context ctx){
        super(ctx, "chronos.db", null, 2);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE kunden ("+
                    " _id INTEGER PRIMARY KEY AUTOINCREMENT, "+
                    " bemerkung TEXT,"+
                    " name TEXT NOT NULL);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS kunden");          
        onCreate(db);           
    }
}

}

[2]

public class Chronos extends Application{

private static SQLiteOpenHelper openHelper;

@Override
public void onCreate(){
    super.onCreate();
    openHelper = new DatabaseHelper (this);
    Chronos.getWritableDatabase().execSQL("PRAGMA foreign_keys=ON;");

}

public static SQLiteDatabase getWritableDatabase(){
    return openHelper.getWritableDatabase();
}

public static SQLiteDatabase getReadableDatabase(){
    return openHelper.getReadableDatabase();
}

}

Dann habe ich eine Activity (ListActivity), um Einträge aus dieser Datenbank anzuzeigen:

public class KundenListActivity extends ListActivity{
private static final String TAG ="KundenListActivity";

private static String[] FROM = {"name", "bemerkung"};
private static int[] TO = {android.R.id.text1, android.R.id.text2};
private static String ORDER_BY = "name DESC";

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Log.d(TAG, "created");

    this.setTitle("Kunden");

    Cursor cursor = Chronos.getWritableDatabase().query("kunden", FROM, null, null, null, null, ORDER_BY);
    Log.d(TAG, "Cursor erstellt");
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, cursor, FROM, TO, 1);
    Log.d(TAG, "Adapter erstellt");
    setListAdapter(adapter);
    Log.d(TAG, "Adapter gesetzt");
}

Dort kommt er bis zum erstellen des Cursors, die Logmeldung Adapter erstellt wird nicht mehr angezeigt, sondern es kommen nur noch ganz viele Fehlermeldungen und die App stürzt ab. Die erste meint, dass die Spalte _id nicht existiert. Aber ich habe sie doch erstellt? Habe auch schon Daten eingefügt über Chronos.getWritableDatabase.execSQL("INSERT....").

Ich weiß echt nicht wo der Fehler liegt. Hoffe ich habe es ausführlich genug erklärt sodass ihr mir hoffentlich weiterhelfen könnt:)

Würde auch gerne wissen wo die Datenbanken abgespeichert werden.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.04.2014, 17:14:07 via Website

Wieso muss die Klasse Chronos von Application erben? Was ist dabei der Fehler? Bitte erkläre diesen und ggf bei Absturz wäre LogCat interessant. Wenn du auf deinem Device kein Root hast, kannst du die DB Dateien nicht einlesen (hab ich zumindest so gelesen) Bekommst du denn in irgendeiner Weise zugriff auf die DB?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jogu Du
  • Forum-Beiträge: 876

21.04.2014, 17:41:23 via Website

Pascal P.

Wieso muss die Klasse Chronos von Application erben? Was ist dabei der Fehler? Bitte erkläre diesen und ggf bei Absturz wäre LogCat interessant. Wenn du auf deinem Device kein Root hast, kannst du die DB Dateien nicht einlesen (hab ich zumindest so gelesen) Bekommst du denn in irgendeiner Weise zugriff auf die DB?

Von Application muss sie erben, damit sie im Manifest unter Application deklariert werden kann und dann beim Start instanziiert wird.. hab ich gedacht..?

Ich habe root und ich weiß halt nicht ob ich Zugriff habe, weiß ja auch nicht wo die DB überhaupt gespeichert werden..

Hier noch LogCat:

User uploaded photo

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.04.2014, 18:08:46 via Website

Ein Bisschen den Log lesen kannst du aber auch. Der Fehler ist, dass die Spalte _id nicht gefunden wird. Befindet sich diese schon in der DB? Nein, deine Chronos Klasse muss nicht von Application erben, dass ist eine normale hilfsklasse die du mit einen "new" instanziiert. Wie soll denn android wissen, welche DB du lesen willst, dem Database helper weisst du doch garkeine DB zu. Schau dir mal das an: http://www.vogella.com/tutorials/AndroidSQLite/article.html Da ist das ganze beschrieben. zusätzlich solltest du dir nochmal die Programmiergrundlagen von Android und Java durchlesen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jogu Du
  • Forum-Beiträge: 876

21.04.2014, 18:11:00 via Website

Pascal P.

Wieso muss die Klasse Chronos von Application erben? Was ist dabei der Fehler? Bitte erkläre diesen und ggf bei Absturz wäre LogCat interessant. Wenn du auf deinem Device kein Root hast, kannst du die DB Dateien nicht einlesen (hab ich zumindest so gelesen) Bekommst du denn in irgendeiner Weise zugriff auf die DB?

ok werde das tutorial mal durcharbeiten. Danke für den link

Hab halt gedacht das es eine Standard Location gibt wo die Datenbank für ein Package gespeichert werden

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

21.04.2014, 19:01:02 via Website

Die Ursache ist, das beim Erstellen eines Cursor-Adapters eine der abgefragten Spalten (im Code dein "FROM" Array) den Namen "_id" haben muss.

Antworten