Wo werden im Handy SQLite Datenbanken gespeichert?

ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Hallo, wer kann mir sagen wo im Handy die SQLite-Datenbank, die durch mein Programm im Handy erzeugt wird, gespeichert?

Oder gibt es eine Möglichkeit direkt zu sagen er soll die DB auf der sdcard abspeichern?

Danke
 
friedger

friedger

Fortgeschrittenes Mitglied
Normalerweise werden die Daten unter /data/data/<packagename>/databases/<dbname> abgespeichert.

Aber Dir steht es frei im ContentProvider statt des DatabaseHelpers direkt die SQLiteDatabase zuverwenden. Da kann man eine beliebige Datei als Datenbank angeben.

Aber dann kann jede App Deine Daten lesen....
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Hm Ok und der Ordner wird bei mir immer leer angezeigt.
Hast du ein minimal Beispiel wie ich Daten aus meiner datenbank als liste ausgeben lassen kann?
Wollte wissen wo die Daten liegen weil ich nicht weiss ob mein Programm die datenbank angelegt hat und ob die Daten in diese geschrieben wurden.
 
Zuletzt bearbeitet:
friedger

friedger

Fortgeschrittenes Mitglied
Tippe in der Konsole aus unter android-..../tools:

adb shell
su
sqlite3 data/data/<packagename>/databases/<dbname>
select * from <tablename>;
.quit
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
ich benutze keinen emulator sondern führe alles drekt im handy aus.

habe es über das terminal probiert

Code:
ensacom-laptop tools # ./adb shell
$ sqlite3 data/data/com.ensacom.android.ensacom1/databases/tankpro
sqlite3: permission denied
$
Kann ich auch direkt auf die Ordnerrstruktur des Handy zugreifen?

Oder kennst Du eine kurze Minimal-Anleitung zum erstellen, schreiben und auslesen?
 
friedger

friedger

Fortgeschrittenes Mitglied
Vorher in der shell
su
eintippen um root rechte zu haben.
Ohne Root-Rechte geht es wohl nicht.

Meinst Du einen DatabaseHelper für SD cards? Oder was für eine Minimal-Anleitung?
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Habe vorher su eingegeben. trotzdem diese Meldung.


Ich brauche nur eine Minimalanleitung, wie ich eine Datenbank anlege, eine Tabelle anlege, einen Datensatz einfüge und die Daten auslese.

Also schon mit DatabaseHelper.
Brauche nur was minimales ohne viel drumrum nur das ich mal sehe wie es funktioniert.
Das Tutorial Notes ist viel zu umfangreich, da blicke ich nicht ganz durch.

Will einfach die Daten dann in einer Liste ausgeben.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Hallo, ich habe schon hier das Problem, das im quelltext selber kein Fehler angezeigt wird, aber wenn ich das Programm starte, das es sofort mit "xxx wurde unerwartet beendet. xxx" beendet wird.

Der Fehler scheint in der Zeile zu liegen.
Code:
ListAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.fahrzeuge, c, columns, names);
Hier mein Quelltext

Code:
public class fahrzeuge extends ListActivity {
    SQLiteDatabase myDB = null; 
      
      
    private final String MY_DATABASE_NAME = "tankpro";
    private final String MY_DATABASE_TABLE = "fahrzeuge";

    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

//Datenbank erstellen oder öffnen        
        myDB = this.openOrCreateDatabase(MY_DATABASE_NAME, MODE_PRIVATE, null);        
        
//Tabelle erstellen wenn noch nicht vorhanden        
        myDB.execSQL("CREATE TABLE IF NOT EXISTS " + MY_DATABASE_TABLE
                + " (id integer AUTO_INCREMENT PRIMARY KEY, name varchar(100), model varchar(100), bemerkungen varchar(255), kraftstoffart varchar(100))"
                +";");
        
//Daten in Tabelle einfügen
        myDB.execSQL("INSERT INTO "+MY_DATABASE_TABLE+" (name, model, bemerkungen, kraftstoffart) "
                                                     +"VALUES ('Audi','TT','Keine Bemerkung','Super');");
//Daten aus Tabelle auslesen        
        Cursor c = myDB.rawQuery("SELECT name, model FROM " + MY_DATABASE_TABLE + ";", null);
    
//Indizies der Spalten speichern        
        int kfzNameColumn  = c.getColumnIndex("name");
        int kfzModelColumn = c.getColumnIndex("model");
        
//Cursor an ersten Treffer setzten
        c.moveToFirst();
        
//KFZName in Variable speichern
        String kfzname = c.getString(kfzNameColumn);
//KFZModel in Variable speichern
        String kfzmodel = c.getString(kfzModelColumn);
        
        startManagingCursor(c);
        
        String[] columns = new String[]{kfzname};
        int[] names = new int[]{R.id.row_entry};
       
        ListAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.fahrzeuge, c, columns, names);
        
       this.setListAdapter(mAdapter);
    }
Kann da einer den Fehler erkennen?

Ich weiß das noch einiges zwischen try und finally gesetzt werden muss.

NACHTRAG:
Ich weiß jetzt das Daten ausgelesen werden. Habe einfach was mit Toast ausgeben lassen
Code:
Toast toast = Toast.makeText(fahrzeuge.this, kfzname + kfzmodel, Toast.LENGTH_SHORT);
 
Zuletzt bearbeitet:
friedger

friedger

Fortgeschrittenes Mitglied
Und was sagt der Stacktrace aus LogCat?
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Ich habe es nun geschafft eine Datenbank anzulegen, Tabellen darin anzulegen, Daten in eine Tabelle zu schreiben und diese Daten auch wieder auszulesen.

Kann bitte jemand den Source durchschauen und mir Tipps geben was man besser machen könnte und was nicht so gut ist?



Haupt-Activity
Code:
public class ensacom1 extends Activity {        
    SQLiteDatabase myDB = null; 
    final static String MY_DATABASE_NAME = "tankpro";
    final static String MY_DATABASE_TABLE = "fahrzeuge";
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onCreateDBAndDBTabled(); //DB und Tables erstellen wenn noch nicht vorhanden
        setContentView(R.layout.main);
    }


    private void onCreateDBAndDBTabled()
    {
        myDB = this.openOrCreateDatabase(MY_DATABASE_NAME, MODE_PRIVATE, null);
        myDB.execSQL("CREATE TABLE IF NOT EXISTS " + MY_DATABASE_TABLE
                        + " (id integer AUTO_INCREMENT PRIMARY KEY, name varchar(100), model varchar(100), bemerkungen varchar(255), kraftstoffart varchar(100))"
                        +";");
    }

Activity Fahrzeug_New
Code:
//Klick auf einen Menüpunkt
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {
        case MENU_SAVE:
            EditText KfzName = (EditText)findViewById(R.id.ed_fahrzeugname);
            EditText KfzModel = (EditText)findViewById(R.id.ed_fahrzeugmodel);
            EditText KfzBemerkungen = (EditText)findViewById(R.id.ed_fahrzeugbemerkung);
            Spinner KfzKraftstoffart = (Spinner)findViewById(R.id.cb_Kraftstoffarten);
                
            InsertToDB(KfzName.getText().toString(), KfzModel.getText().toString(), KfzBemerkungen.getText().toString(), KfzKraftstoffart.getSelectedItem().toString());
            Intent ifahrzeuge = new Intent(this, fahrzeuge.class);
            startActivity(ifahrzeuge);
            return true;    
        }
        return false;
    }


//Neues Fahrzeug in DB speichern       
    public void InsertToDB(String kfzName, String kfzModel, String kfzBemerkungen, String kfzKraftstoffart)
    {
        SQLiteDatabase myDB = null;
        try {
            myDB = this.openOrCreateDatabase(ensacom1.MY_DATABASE_NAME, MODE_PRIVATE, null);    
            myDB.execSQL("INSERT INTO "+ensacom1.MY_DATABASE_TABLE+" (name, model, bemerkungen, kraftstoffart) "
                                                   +"VALUES ('"+kfzName+"','"+kfzModel+"','"+kfzBemerkungen+"','"+kfzKraftstoffart+"');");
        }
        finally
        {
            if (myDB != null)
                myDB.close();
        }
    }

Activity fahrzeuge
Code:
public class fahrzeuge extends ListActivity {
    SQLiteDatabase myDB = null; 
    ArrayList<String> results = new ArrayList<String>();  
    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        
        myDB = this.openOrCreateDatabase(ensacom1.MY_DATABASE_NAME, MODE_PRIVATE, null);        
        Cursor c = myDB.rawQuery("SELECT name, model FROM " + ensacom1.MY_DATABASE_TABLE + ";", null);
        int kfzNameColumn  = c.getColumnIndex("name");
        int kfzModelColumn = c.getColumnIndex("model");
        startManagingCursor(c);
        c.moveToFirst();
     
        if (c != null) {
          if (c.isFirst()) {
                 int i = 0;
              
                 do {
                      i++;
     
                      String kfzname = c.getString(kfzNameColumn);
                      String kfzmodel = c.getString(kfzModelColumn);
                      results.add(kfzname + " - " + kfzmodel);
                 } while(c.moveToNext());
              }
        }
        this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
    }

Bin für jeden Verbesserungsvorschlag dankbar.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Wie kann ich denn den Stacktrace aus LogCat auslesen?
 
friedger

friedger

Fortgeschrittenes Mitglied
LogCat sieht man in Eclipse oder mit LogCat.apk.

Statt ArrayAdapter würde ich auf jeden Fall SimpleCursorAdapter verwenden (um nicht 500 Zeilen auslesen und dann nur 10 anzuzeigen)
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Danke für die Tipps.
Habe jetzt erfahren dass man die logcat auch mit dem DDMS Tool auslesen kann.
 
ensacom

ensacom

Ambitioniertes Mitglied
Threadstarter
Hallo, wie könnte ich folgendes abändern dass ich anstatt ArrayAdapter SimpleCursorAdapter verwenden kann?


Code:
this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results));
 
R

RED-BARON

Fortgeschrittenes Mitglied
Hallo,

schließe mich der Fragestellung an aber beziehe mich auf den
Emulator. Wehe ich irgendwo auf der Festplatte die im Emul
angelegte Datenbank ?

Besten Dank ! RB
 
S

swordi

Gewerbliches Mitglied
ja geh im eclipse auf die DDMS ansicht,

dann kannst du im dateisystem des emulators arbeiten, dort gibts es data/data/DEIN-PROGRAMM/database

da liegt deine db
 
R

RED-BARON

Fortgeschrittenes Mitglied
einfach nur cool :D

Export der DB is so cool ! Import noch nicht getestet ...

irgendwann gehts ja auch mal um Support, da ist prima wenn
der eigens verursachte Datensalat betrachtet und gebogen
werden kann.

SQLite Control Center - SQLiteCC

Ich nehme mal an der Export/Import auf das reale Gerät kann auch
erfolgen. Steht im Moment noch nicht auf dem Plan, mangels Gerät.
 
Oben Unten