Wie speichere ich dauerhaft Daten unter Android ?

  • 13 Antworten
  • Neuester Beitrag
Diskutiere Wie speichere ich dauerhaft Daten unter Android ? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
E

Elbern

Neues Mitglied
Guten Tag,

ich Entwickel gerade eine "Budget" App und komme nicht weiter.
Der Benutzer gibt ein Datum an und wie viel Euro er ausgegeben hat mit zusätzlich einer kleinen Beschreibung.
Diese Daten sollen gespeichert werden und in der App einzuschauen sein.
Nur finde ich dafür nichts passendes, vielleicht hat ja hier einer eine Idee.

mfg
Elbern
 
swa00

swa00

Moderator
Teammitglied
Hallo Elbern,

schau dir mal die SharedPreferences an, oder du realisierst das Ganze mit einer lokalen
Datenbank ( z.b. SqLite)
 
1

123thomas

Fortgeschrittenes Mitglied
Ich hätte dir auch wie swa00 die Möglichkeiten genannt.
Würde dir aber empfehlen die Datenbank zu nehmen, weil wenn es später doch noch mehr Attribute gespeichert werden sollen wird das mit SharedPreferences schnell unübersichtlich. Wobei die Datenbank auch nicht mal eben so aufgesetzt ist. Aber es gibt viele Tutorials dazu.
 
E

Elbern

Neues Mitglied
Ist es also möglich lokal auf dem Handy eine Datenbank anzulegen, oder benötige ich einen Server?
 
swa00

swa00

Moderator
Teammitglied
Sqlite ist eine Datenbank, die auf lokale Dateien basiert.
Schaus dir einfach mal an und deine Fragen werden von selbst beantwortet :)
 
Zuletzt bearbeitet:
lordzwieback

lordzwieback

Erfahrenes Mitglied
Hier noch ein Video-Tutorial für den Einstieg in Android und SQLite - schaue ich mir auch gerade an. Musst aber auch nicht das nehmen, gibt einige Tutorials dafür.
 
Jaiel

Jaiel

Experte
SQLite ist easy. Hier mal ein Beispiel wie dein Helper der die Datenbank mit einer Tabelle darin aufbaut aussehen könnte:

PHP:
public class DataBaseHelper extends SQLiteOpenHelper {


    //Datenbankname und Version
    public static final String DB_NAME = "budget.db";
    public static final int DB_VERSION = 1;

    //Tabellenname
    public static final String TABLE_BUDGET_LIST = "budget_list";

    //Spaltennamen in der Tabelle definieren
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_DATE="date";
    public static final String COLUMN_MONEY="money";
            ...

    //hier wird das CREATE TABLE Statement in einem String gespeichert um es später auszuführen
    public static final String SQL_CREATE = "CREATE TABLE " + TABLE_BUDGET_LIST +
            "(" +COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
            COLUMN_DATE+" INTEGER NOT NULL, "+ COLUMN_MONEY+" REAL NOT NULL"+ " );";

    public DataBaseHelper(Context context){
        super (context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
In SQL baust du ja Tabellen in deine Datenbank mit dem CREATE TABLE Statement.

Z.B.
Code:
CREATE TABLE tabellenname (
id  INTEGER PRIMARY KEY,
name TEXT,
adresse TEXT,
alter INTEGER
);
Das wäre dann folgende Tabelle:
|---+---------+-----------+-------|
| id | name | adresse | alter |
|---+---------+-----------+-------|


ez pz lemon squeezy :)

edit:

Da hier gefragt wurde dass ich näher erläutere wie z.B. eine Abfrage geht hier der Code zu einer weiteren Helferklasse die den Zugriff auf die Datenbank übernimmt.

Ich habe oben jetzt mal explizit die Klassen auf die Bedürfnisse des TE zugeschnitten.

Ich versuche es simpel zu halten und gebe der Helferklasse nur die Möglichkeit zum auslesen oder einfügen.

PHP:
public class DataBaseSource {

    private static final String LOG_TAG = DataBaseSource.class.getSimpleName();

    private SQLiteDatabase database;
    private DataBaseHelper dbHelper;

    private String[] columns = {  
        DataBaseHelper.COLUMN_ID,
        DataBaseHelper.COLUMN_DATE,
        DataBaseHelper.COLUMN_MONEY
    };

    public DataBaseSource(Context context) {

        dbHelper = new DataBaseHelper(context);
    }

    public boolean open() {
        try{
            database = dbHelper.getWritableDatabase();
            return true;
        }
        catch (SQLiteException e){
            e.printStackTrace();
        }
        return false;
    }

    public void close() {
        dbHelper.close();

    }

    public BudgetItem insertBudgetItemToDB(String date, double money) {
        if(!database.isOpen())
            return null;

        ContentValues values = new ContentValues();
        values.put(DataBaseHelper.COLUMN_NUM, date);
        values.put(DataBaseHelper.COLUMN_MONEY, money);


        Cursor cursor = database.query(DataBaseHelper.TABLE_BUDGET_LIST,
                columns, DataBaseHelper.COLUMN_ID + "=" +
                database.insert(DataBaseHelper.TABLE_BUDGET_LIST, null, values),
                null, null, null, null);

        if(cursor==null||!cursor.moveToFirst())
            return null;

        BudgetItem bItem= cursorToBudgetItem (cursor);

        cursor.close();

        return bItem;
    }

    private BudgetItem cursorToBudgetItem(Cursor cursor) {
        BudgetItem tmpBI=null;
        try{
            tmpBI = new BudgetItem(
                cursor.getInt(cursor.getColumnIndexOrThrow(DataBaseHelper.COLUMN_ID)),
                cursor.getString(cursor.getColumnIndexOrThrow(DataBaseHelper.COLUMN_DATE)),
                cursor.getString(cursor.getColumnIndexOrThrow(DataBaseHelper.COLUMN_MONEY)));}
        catch(IllegalArgumentException e){
            e.printStacktrace();
        }
        return tmpBI;
    }

    public List<BudgetItem> getAllBudgetItemsFromDB() {
        List<BudgetItem> bItemList = new ArrayList<>();

        Cursor cursor = database.query(DataBaseHelper.TABLE_BUDGET_LIST,
                columns, null, null, null, null, null);

        if(cursor==null||!cursor.moveToFirst())
                return null;

        while(!cursor.isAfterLast()) {
            bItemList.add(cursorToBudgetItem(cursor));
            if(!cursor.moveToNext())
                return null;
        }

        cursor.close();

        return bItemList;
    }
}
Die Methoden insertBudgetItemToDB(String, double) und getAllBudgetItemsFromDB() sind zum einfügen und auslesen.

insertBudgetItemToDB("12.12.1212",999.99) - fügt einen neuen Eintrag ein
getAllBudgetItemsFromDB() - gibt eine Liste der gespeicherten Einträge zurück

Vorrausgesetzt du hast diese Klasse:

PHP:
public class BudgetItem{
    int id;
    String date;
    double money;
 
    private BudgetItem()

    public BudgetItem(int id,String date, double money){
        this.id=id;
        this.date=date;
        this.money=money;
    }

Dann kann man folgenden Code ausführen zum auslesen und einspeichern:
PHP:
        DataBaseSource db=new DataBaseSource(context);
        if(!db.open())
            return;

        //Alles in der Datenbank wird in dieser Liste gespeichert
        List<BudgetItem> bItemList = db.getAllBudgetItemsFromDB())
        if(bItemList==null)
            return;

        //2 Einträge in die Datenbank einfügen
        BudgetItem bItmp=null;

        if((bItmp=db.insertBudgetItemToDB("09.02.2017", 53.85))!=null)
            bItemList.add(bItmp);
    
        if((bItmp=db.insertBudgetItemToDB("10.02.2017", 49.13))!=null)
            bItemList.add(bItmp);

        db.close();
        db=null;
Die Liste mit den Objekten kannst du nun benutzen z.B. als Datenquelle für einen Adapter der eine Listview speist oder sonstiges...

Jaiel
 
Zuletzt bearbeitet:
swa00

swa00

Moderator
Teammitglied
@Jaiel

Hallo Jaiel,

damit er wirklich gut zurecht kommt , würde ich noch empfehlen, ihm ein query Beispiel
(create, insert, select) anzugeben.
Mach Deine Hilfe oben bitte komplett

Danke
 
Zuletzt bearbeitet:
swa00

swa00

Moderator
Teammitglied
Haben wir hier im Forum keine Beispiele unter Android Codeschnipsel ?!
Ich Danke Dir, doch da wird bestimmt irgendwo ein Schnipsel rumliegen.

Aber du weisst selbst - das schaut keine Sau" nach :)

Bevor er dann ggf morgen nochmal fragt , war das der beste Weg :)

Thx

P.S Dir steht es aber frei , ein schönes aktuelles Tutorial im Schnipsel bereich zu erstellen :)
 
Zuletzt bearbeitet:
markus.tullius

markus.tullius

Experte
@Jail, ein sehr schönes Beispiel. Könntest Du es um eine Fehlerbehandlung (try and catch) erweitern?
 
Jaiel

Jaiel

Experte
Ja hab ich gemacht. Und viele if-Abfragen wo es sinnvoll wäre. Ist das ok so?!

Finde nichts zufriedenstellendes wie man mit einem gescheiterten query() umgehen soll bzw. was dann passiert sollte es fehlerhaft abgelaufen sein. Ist das Cursor-objekt dann null? Wenn ja dort unbedingt noch den Cursor auf null prüfen.
 
swa00

swa00

Moderator
Teammitglied
Ist das Cursor-objekt dann null? Wenn ja dort unbedingt noch den Cursor auf null prüfen.

Yupp, ist er :)
Cursor m1Cursor = database.rawQuery("SELECT * FROM favorites ORDER BY name", null);
if (m1Cursor != null)
{
if(m1Cursor.moveToFirst())
{
 
markus.tullius

markus.tullius

Experte
OK
 
Ähnliche Themen - Wie speichere ich dauerhaft Daten unter Android ? Antworten Datum
17
7