Zugriff auf eine bestimmte Tabelle einer Datenbank

M

MichaelGeorg

Neues Mitglied
0
Hallo,
folgendes Szenario:
eine DB (myDB) mit zwei Tabellen (Tabelle 01 und Tabelle 02)

ein Database Helper (SQLiteOpenHelper)

Activity 01, diese soll mit addData, Delete, update und viewall auf Tabelle 01 zugreifen
Actvity 02, diese soll mit addData, Delete, update und viewall auf Tabelle 02 zugreifen

Frage: wie kann ich in der jeweiligen Activity auf die spezifische Tabelle zugreifen? (Beispiele willkommen)
Frage: Kann ich das über einen DatabaseHelper erledigen? (Ebenfalls Beispiele willkommen)

Grüße an alle Wissenden und die, die es werden wollen
 
@MichaelGeorg

Hallo Michael,

herzlichst willkommen im Forum.

Die wohl eleganteste Lösung ist eine eigene Klasse mit Getter und Setter, in der du deine kompletten DB Handlings
realisierst. (OOP) Und natürlich zur Klassenübersicht mit einen DatabaseHelper oder "zu Fuss".

Bei Bedarf als SingleTon
 
Zuletzt bearbeitet:
So, meine Antwort hat etwas gedauert. Ich habe mal eine Variante mit DatabaseHelper ausgetüftelt. Genau genommen sind es zwei Helper.
Bedauerlicher Weise wird entweder die eine oder die andere Tabelle angelegt. Ich kann auch Daten eingeben und speichern.
Hat einer von Ihnen/ Euch einen Vorschlag wie ich trotzdem zwei Tabellen erstellen kann. Es scheint so, dass der eine Helper den anderen überschreibt.
Anbei mal meinen Code:

Code:
package de.mikels.haushaltsbuch01;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;

public class DataBaseHelper0304 extends SQLiteOpenHelper {

    public static final String DATABASE_NAME ="HAUSHALTSBUCH.db";
    public static final String TABLE_NAME = "bankdaten_tbl";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "BANKNAME";
    public static final String COL_3 = "KONTONR";
    public DataBaseHelper0304(@Nullable Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase db = this.getWritableDatabase();    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE \"bankdaten_tbl\" (\n" +
                "\t\"ID\"\tINTEGER PRIMARY KEY AUTOINCREMENT,\n" +
                "\t\"BANKNAME\"\tTEXT,\n" +
                "\t\"KONTONR\"\tTEXT NOT NULL\n" +
                ")"); }

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

    public boolean insertData (String varBANKNAME, String varKONTO){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put (COL_2, varBANKNAME);
        contentValues.put (COL_3, varKONTO);

        long result = db.insert (TABLE_NAME, null, contentValues);
        if (result == -1){
            return false;
        }
        else{
            return true;}

    }
}


package de.mikels.haushaltsbuch01;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;

public class DataBaseHelper0305 extends SQLiteOpenHelper {

    public static final String DATABASE_NAME ="HAUSHALTSBUCH.db";
    public static final String TABLE_NAME = "zahlarten";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "ZAHLART";


    public DataBaseHelper0305(@Nullable Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase db = this.getWritableDatabase();  }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + " ( ID INTEGER PRIMARY KEY AUTOINCREMENT, ZAHLART TEXT)"); }

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

    public boolean insertData (String zahlart){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put (COL_2, zahlart);

        long result = db.insert (TABLE_NAME, null, contentValues);
        if (result == -1){
            return false;
        }
        else{
            return true;
        }
    }
}
 
Hallo @MichaelGeorg,

ich habe deine Helperklasse nur überflogen - scheint OK zu sein .

Bedauerlicher Weise wird entweder die eine oder die andere Tabelle angelegt.
Wie nimmst du dir denn die Instanz zu diesen Klassen in der Activity, damit OnCreate auch ausgeführt wird ?

Anmerkung : Deine Routinen besitzen keinerlei try/catch Rumpfe - das wird auf Kurz oder Lang schief gehen
 
Zuletzt bearbeitet:
Hallo Stefan,
ich schicke Dir den Code der Activity für die Bankdaten (Helper 0304).Das mit dem try/catch muss ich mal recherchieren. In der MainActivity ist nur ein Menu enthalten, welches ohne Probleme die Activity Bankdaten (oder eben Activity zahlarten) aufruft.

Code:
package de.mikels.haushaltsbuch01;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class bankdaten extends AppCompatActivity {
    DataBaseHelper0304 haushaltsbuch;

    EditText varBANKNAME, varKONTONR;
    Button btnAddData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bankdaten);
        haushaltsbuch = new DataBaseHelper0304(this);

        varBANKNAME = (EditText)findViewById(R.id.editText_bankname);
        varKONTONR = (EditText)findViewById(R.id.editText_konto);
        btnAddData = (Button)findViewById(R.id.btnAddData);
        AddData();
    }

    public void AddData(){
        btnAddData.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        boolean isInserted =   haushaltsbuch.insertData(varBANKNAME.getText().toString(), varKONTONR.getText().toString());
                        if (isInserted = true) {
                            Toast.makeText(bankdaten.this ,"Daten hinzugefügt",Toast.LENGTH_LONG).show();
                            varBANKNAME.setText("");
                            varKONTONR.setText("");
                        }
                        else{
                            Toast.makeText(bankdaten.this ,"Nichts hinzugefügt",Toast.LENGTH_LONG).show();
                        }
                    }
                }
        );
    }
}
 
Hallo Michael,

wo machst du fest , dass bei dir die Tabelle nicht angelegt wird , was geben deine Fehlerloggings/Debugging aus ?
Hast du auch die entsprechenden Permissions gesetzt und beim User angefordert ?


Hier mal ein Quick & Dirty Bespiel , welches zu 100% funktioniert .
(Natürlich auch ohne Fehlerbehandlung)

Usage :
LoggingDB test = new LoggingDB();
test.openDB(getApplicationcontext());
test.putRegisterValues(100,200);
test.closeDB();


Code:
public class LoggingDB
{

    private SQLiteDatabase database = null;
    private Context mContext;

    ///////////////////////////////////////////////////////////////
    public void openDB(Context con)
    {
        File appDir = mContext.getExternalFilesDir(null);
        database = new SDBSQLiteHelperRegister(mContext,appDir.toString()+ "/app_logging.db").getWritableDatabase();

    }
    ///////////////////////////////////////////////////////////////
    public void closeDB()
    {
     if ( database != null) database.close();
    }

    ///////////////////////////////////////////////////////////////
    public void putRegisterValues(int reg_1, int reg_2)
    {
        ContentValues values = new ContentValues();
        values.put(Register.COLUMN_VALUE_1 , reg_1);
        values.put(Register.COLUMN_VALUE_2, reg_2);

        database.insert(Register.TABLE_NAME, null, values);


    }
    //////////////////////////////////////////////////////////////////////////////
    public static class Register implements BaseColumns
    {
        public static final String TABLE_NAME      = "register";
        public static final String COLUMN_VALUE_1  = "value_1";
        public static final String COLUMN_VALUE_2  = "value_2";


        public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " +
                TABLE_NAME + " (" +
                _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_VALUE_1 + " TEXT, " +
                COLUMN_VALUE_2 + " TEXT " + ")";

    }
    //////////////////////////////////////////////////////////////////////////////
    public class SDBSQLiteHelperRegister extends SQLiteOpenHelper
    {
        private static final int DATABASE_VERSION = 4;
        public SDBSQLiteHelperRegister(Context context, String db)
        {
            super(context, db, null, DATABASE_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase)
        {
            sqLiteDatabase.execSQL(Register.CREATE_TABLE);
        }
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)
        {
            //sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + Settings.TABLE_NAME);
            onCreate(sqLiteDatabase);
        }
    }

}
 
Zuletzt bearbeitet:
Hallo Stefan,
dass die Tabellen nur entweder/oder angelegt werden kann ich über den DB Browser (SQLite) sehen. Rufe ich (bei nicht angelegter Datenbank) die Activity zahlarten auf wird die Datenbank und die Tabelle zahlarten angelegt. Starte ich danach die Activity bankdaten wird die Tabelle nicht angelegt. Umgekehrt ist das genau so.

Deinen Code muss ich erstmal verstehen und klären in welcher Activity oder welchem Helper ich den an welcher Stelle einbinden muss.

Liebe Grüße
Michael
 
Hallo wenn du auf beide Tabellen gleichzeitig zugreifen wilsst.
Musst du auch für beide helper eine Instanz erstellen. In deiner activity erstellst du nur eine.
In jeden helper wird bei dir ja nur eine Tabelle erstellt.


haushaltsbuch04= new DataBaseHelper0304(this);
haushaltsbuch05 = new DataBaseHelper0305(this);

Dann werden auch beide Tabellen erstellt.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swa00
Hallo jogimuc,

habe Deinen Vorschlag wie nachstehend eingearbeitet. Leider ohne Erfolg. Helper05 ist für "zahlarten" Tabelle, Helper04 für "bankdaten". Nach wie vor wird jeweils nur die eine oder andere Tabelle erstellt. Eingabe wird bei beiden mit "Daten hinzugefügt" bestätigt.

Code:
package de.mikels.haushaltsbuch01;
**/////////////////// Code für die beiden Activities********************************************************
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class bankdaten extends AppCompatActivity {
    DataBaseHelper0305 haushaltsbuch05;
    DataBaseHelper0304 haushaltsbuch04;

    EditText varBANKNAME, varKONTONR;
    Button btnAddData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bankdaten);
       
        haushaltsbuch04 = new DataBaseHelper0304(this);
        haushaltsbuch05 = new DataBaseHelper0305(this);

        varBANKNAME = (EditText)findViewById(R.id.editText_bankname);
        varKONTONR = (EditText)findViewById(R.id.editText_konto);
        btnAddData = (Button)findViewById(R.id.btnAddData);
        AddData();
    }

    public void AddData(){
        btnAddData.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        boolean isInserted =   haushaltsbuch04.insertData(varBANKNAME.getText().toString(), varKONTONR.getText().toString());
                        if (isInserted = true) {
                            Toast.makeText(bankdaten.this ,"Daten hinzugefügt",Toast.LENGTH_LONG).show();
                            varBANKNAME.setText("");
                            varKONTONR.setText("");
                        }
                        else{
                            Toast.makeText(bankdaten.this ,"Nichts hinzugefügt",Toast.LENGTH_LONG).show();
                        }
                    }
                }
        );
    }
}


package de.mikels.haushaltsbuch01;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class zahlarten extends AppCompatActivity {
    DataBaseHelper0305 haushaltsbuch05;
    DataBaseHelper0304 haushaltsbuch04;

    EditText zahlart;
    Button btnAddData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zahlarten);
        haushaltsbuch05 = new DataBaseHelper0305(this);
        haushaltsbuch04 = new DataBaseHelper0304(this);

    zahlart = (EditText)findViewById(R.id.editText_zahlart);
    btnAddData = (Button)findViewById(R.id.btnAddData);
    AddData();
    }

    public void AddData(){
        btnAddData.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                      boolean isInserted =   haushaltsbuch05.insertData(zahlart.getText().toString());
                        if (isInserted = true) {
                            Toast.makeText(zahlarten.this ,"Daten hinzugefügt",Toast.LENGTH_LONG).show();
                            zahlart.setText("");
                        }
                        else{
                            Toast.makeText(zahlarten.this ,"Nichts hinzugefügt",Toast.LENGTH_LONG).show();
                        }
                    }
                }
        );


    }


Ist an den jeweiligen Helpern noch etwas zu ändern?

anbei deren Code:

Code:
package de.mikels.haushaltsbuch01;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;

public class DataBaseHelper0304 extends SQLiteOpenHelper {

    public static final String DATABASE_NAME ="HAUSHALTSBUCH.db";
    public static final String TABLE_NAME = "bankdaten_tbl";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "BANKNAME";
    public static final String COL_3 = "KONTONR";

    public DataBaseHelper0304(@Nullable Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase db = this.getWritableDatabase();    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE \"bankdaten_tbl\" (\n" +
                "\t\"ID\"\tINTEGER PRIMARY KEY AUTOINCREMENT,\n" +
                "\t\"BANKNAME\"\tTEXT,\n" +
                "\t\"KONTONR\"\tTEXT NOT NULL\n" +
                ")"); }

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

    public boolean insertData (String varBANKNAME, String varKONTO){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put (COL_2, varBANKNAME);
        contentValues.put (COL_3, varKONTO);

        long result = db.insert (TABLE_NAME, null, contentValues);
        if (result == -1){
            return false;
        }
        else{
            return true;}

    }
}

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;

public class DataBaseHelper0305 extends SQLiteOpenHelper {

    public static final String DATABASE_NAME ="HAUSHALTSBUCH.db";
    public static final String TABLE_NAME = "zahlarten";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "ZAHLART";


    public DataBaseHelper0305(@Nullable Context context) {
        super(context, DATABASE_NAME, null, 1);
        SQLiteDatabase db = this.getWritableDatabase();  }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + " ( ID INTEGER PRIMARY KEY AUTOINCREMENT, ZAHLART TEXT)"); }

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

    public boolean insertData (String zahlart){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put (COL_2, zahlart);

        long result = db.insert (TABLE_NAME, null, contentValues);
        if (result == -1){
            return false;
        }
        else{
            return true;
        }
    }
}
 
Zuletzt bearbeitet:
Hast du denn auch mal auch meine Klasse umgesetzt ??
 
Hallo Stefan,

ich habe das noch nicht probiert, weil ich wie vorher geschrieben, nicht weiß wohin mit dem Code. Sorry, blutiger Anfänger. Habe jahrelang hochgradige Anwendungen in Visual Basic beschrieben. Aber Android und Java , das ist schon etwas anderes.

Soweit ich meine das zu verstehen gilt Dein Code auch nur für eine Tabelle??

Liebe Grüße
Michael

P.S. Ich hatte das schon in VB fertig, allerdings hat meine Frau kein Windows und möchte aber auch damit arbeiten können. Möglicherweise ist die Adaption meiner Vorstellungen in VB bei Android falsch.
 
Zuletzt bearbeitet:
Alles klar , das ist alles kein Beinbruch ...

Nun , das von mir eingestellte Beispiel ist eine separate Klasse mit Getter und Setter - ein Grundgerüst von OOP.
Grundsätzlich ist auch für ein Androidgerät deine Vorgehensweise ein wenig zu statisch und man merkt ,
dass du aus dem Basicbereich kommst.

Java resp. Android ist Thread lastig und man sollte immer darauf achten , den System resp. der UI Luft geben,
ihren Job zu tun. Immer mit Listener oder Callbacks arbeiten - Möglichst Klassen auslagern und auch
seltens statische Variablen verwenden.Die gibt es nämlich nicht unter Android nicht, so wie du sie von C/C++/Basic
her kennst.


In der OnCreate von der Activity sollte man z.b. keine blockierenden Operationen durchführen.

Also für dein Beispiel : Die Datenbanken incl. Fileoperationen und auch noch in einer Schleife füllen,
ist grundsätzlich tötlich - Gibt dem System Luft seine UI aufzubauen, erstelle dann die Datenbanken und wenn diese ein
gültiges Callback zurückliefern - erst dann füllst du deine Tabellen.

Das Ganze in OnClick zu machen ist auch nicht das Gelbe vom Ei - OnClick ist eine UI-Operation.
das KANN klappen , aber ist absolut nicht anzuraten.

Nochmal an dieser Stelle die Frage ( blieb unbeantwortet) : Hast du auch alle Permissions in der Manifest gesetzt
und den User nach den Write/Read Permissions gefragt ?
Das fehlt mir komplett in deinem Source und ist ab API23 zwingend
 
Zuletzt bearbeitet:
@ swa00 alles richtig was du sagst nur woran machst du fest das er permission braucht. Kann da in seinem Code keinen Grund dafür erkenne.

Bin mir nicht sicher ob das ein zielführender Rat ist.

@MichaelGeorg wenn ich das richtig sehe sind das zwei verschiedene activitys in denen du das bearbeiten willst.

Greifst aber in jeder immer nur auf einen heller zu . Somit auch nur auf eine Tabelle.
Wenn du in die andere activity gehst sind greifst du wider nur auf die andere Tabelle zu. Aber nicht auf die erste Tabelle.

Eine activity ist eine abgeschlossene Einheit.
 
Frohes Neues nachträglich Jörg !! :)

alles richtig was du sagst nur woran machst du fest das er permission braucht. Kann da in seinem Code keinen Grund dafür erkenne.

na er schreibt doch eine physische Datei ? :)

Code:
 public static final String DATABASE_NAME ="HAUSHALTSBUCH.db";
 
Zuletzt bearbeitet:
Das ist doch die db die der helper erstellt.

Wünsche auch noch ein gutes neues Jahr
 
Pro Datenbank Datei sollte es nur einen SQLiteOpenHelper geben. Dieser managt die Struktur der Datenbank wie Tabellen.
Für den Zugriff darauf kannst du dir dann wie von swa00 vorgeschlagen spezielle Klassen pro Tabelle bauen.

Schau dir auch mal Room an, das nimmt dir einiges ab.

Für eine DB Datei im internen Speicher braucht man natürlich keine Permission.
 
  • Danke
Reaktionen: swa00 und jogimuc

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
126
swa00
swa00
R
Antworten
6
Aufrufe
1.011
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
486
jogimuc
J
Zurück
Oben Unten