1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Wo werden im Handy SQLite Datenbanken gespeichert?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ensacom, 17.05.2009.

  1. ensacom, 17.05.2009 #1
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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
     
  2. friedger, 17.05.2009 #2
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    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....
     
  3. ensacom, 17.05.2009 #3
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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: 17.05.2009
  4. friedger, 17.05.2009 #4
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Tippe in der Konsole aus unter android-..../tools:

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

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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?
     
  6. friedger, 17.05.2009 #6
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    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?
     
  7. ensacom, 17.05.2009 #7
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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.
     
  8. friedger, 18.05.2009 #8
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
  9. ensacom, 18.05.2009 #9
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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: 18.05.2009
  10. friedger, 18.05.2009 #10
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    Und was sagt der Stacktrace aus LogCat?
     
  11. ensacom, 18.05.2009 #11
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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.
     
  12. ensacom, 18.05.2009 #12
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Wie kann ich denn den Stacktrace aus LogCat auslesen?
     
  13. friedger, 19.05.2009 #13
    friedger

    friedger Erfahrener Benutzer

    Beiträge:
    175
    Erhaltene Danke:
    15
    Registriert seit:
    15.01.2009
    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)
     
  14. ensacom, 19.05.2009 #14
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    Danke für die Tipps.
    Habe jetzt erfahren dass man die logcat auch mit dem DDMS Tool auslesen kann.
     
  15. ensacom, 19.05.2009 #15
    ensacom

    ensacom Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    68
    Erhaltene Danke:
    5
    Registriert seit:
    15.05.2009
    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));
     
  16. RED-BARON, 21.10.2009 #16
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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
     
  17. swordi, 21.10.2009 #17
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
    RED-BARON bedankt sich.
  18. RED-BARON, 21.10.2009 #18
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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.
     

Diese Seite empfehlen