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

DB-Werte in Panel auslesen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Duckemai, 22.08.2011.

  1. Duckemai, 22.08.2011 #1
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Hallo,

    ich würde gerne in einem Panel-Konstruktor meiner Klasse:
    public class Panel extends SurfaceView{...}
    Werte aus einer SQLite DB übernehmen.


    Für die Datenbank habe ich zwei Klassen, Werte sind auch schon drin:

    public class DbSQLStatement extends SQLiteOpenHelper
    public class DBAction extends Activity (=SQL-Statements)

    Problem:
    Wenn ich nun auf die DB aus dem Panel heraus zugreifen möchte:

    dbaction = new DBAction();
    fahrzeug = new Fahrzeug[dbaction.oeffneDBUndLies(this, "anzahlFahrzeuge")];

    sagt mir Eclipse, dass die Fkt:
    oeffneDBUndLies(Context context, String variablenname)
    einen Context erwartet und nicht ein Panel. (Klar, ich rufe ja von einem Panel aus auf!). Ich kann Context aber nicht mit Panel überschreiben, weil der Context in der oeffneDBUndLies(...) zwingend erforderlich ist, nämlich hier:

    dbsqlstatement = new DbSQLStatement(this); //geht nur mit Context
    sowie

    SQLiteDatabase db =
    dbsqlstatement.getReadableDatabase();


    Weiß jemand, wie ich trotzdem vom Panel aus Zugriff auf die DB/Werte nehmen könnte?

    Vielen Dank
    Duckemai
     
  2. sixi, 23.08.2011 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    Erstell dir einen eigenen Constructor dem du zusätzlich den Context übergibst, wenn du das Panel erzeugst.
     
    Duckemai bedankt sich.
  3. Duckemai, 23.08.2011 #3
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Das geht bei mir leider nicht so leicht.

    Ich rufe nämlich mein Panel über eine Activity auf. Das mache ich deshalb, damit ich im laufenden Spiel Buttons ansprechen kann. Das sieht dann also so aus:

    GameActivity:
    Code:
    ...
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
    und in der main.xml befinden sich die Buttons der Activity SOWIE der Panelaufruf. D.h.: wenn setContentView(R.layout.main) aufgerufen wird, springt das Programm in das Panel.

    Code:
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
       [COLOR=Red] <com.game.android.myGame.Panel android:id="@+id/layout_Panel"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />[/COLOR]
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content"
                android:layout_weight="1">
                <Button 
                    android:id="@+id/done2" 
                    ...
                    
    Zwar wird dem Panel ein Context übergeben. Der lässt sich aber im Panel-Konstruktor nicht benutzen ...
    Code:
    [FONT=Verdana][COLOR=#0000C0]dbaction[/COLOR] = [B][COLOR=#7F0055]new[/COLOR][/B] DBAction();
     [/FONT] [FONT=Verdana][COLOR=#0000C0]fahrzeug[/COLOR] = [B][COLOR=#7F0055]new[/COLOR][/B] Fahrzeug[[COLOR=#0000C0]dbaction[/COLOR].oeffneDBUndLies([B]context[/B], [COLOR=#2A00FF]"anzahlFahrzeuge"[/COLOR])];[/FONT]
     
    ...und löst eine NullPointerException aus. Vielleicht, weil die GameActivity noch gar nicht komplett durch die onCreate durch ist.

    Besser wäre es, wenn ich das Panel nicht schon in der xml aufrufen würde. Dann könnte ich die onCreate der GameActivity durchlaufen, die Datenbank auslesen und dann das Panel starte.

    Hast Du/Ihr eine Idee, wie ich das hier machen könnte?
     
    Zuletzt bearbeitet: 23.08.2011
  4. sixi, 23.08.2011 #4
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    Hmm... dann erstellste 'nen statischen Context? z.B. eine "StartActivity" die du den anderen "vorschaltetst" und in der onCreate so weit oben wie möglich den Context in eine statische Variable speicherst. Dann kannste dir den aus dem onCreate vom Panel "abholen". Oder in deine Activity die das Panel beinhaltet - da musst du dann nur drauf achten, dass es VOR dem setContentView(...) passiert

    Code:
    ...
    public static Context CONTEXT;
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            CONTEXT = this;
    
            setContentView(R.layout.main);
    
     
    Duckemai bedankt sich.
  5. the_alien, 23.08.2011 #5
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Was genau ist denn ein Panel? Ein View wird ja auch immer mit einem Context erstellt und über getContext() bekommt man den...
     
    Duckemai bedankt sich.
  6. Duckemai, 23.08.2011 #6
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Hallo,

    ich habe die letzten Stunden versucht Eure Vorschläge umzusetzen. Das Problem bei beiden Lösungen ist, das der Context nur unvollständig ist, da er inmitten der onCreate (der Activity(sixi) oder im Konstruktor des Panels(the_alien)) erstellt wird. Dann scheint ein Context nicht richtig zu funktionieren. Daher kann ich die Datenbank nur scheinbar abfragen:

    Code:
    [FONT=Verdana]public class Panel extends SurfaceView{...
    public Panel(Context context, AttributeSet attrs) {
            super(context, attrs);
    ...
    [COLOR=Orange]@sixi:  int test = dbaction.oeffneDBUndLies(gameActivity.CONTEXT, "numberOfVehicle");[/COLOR]
    oder
    [COLOR=DeepSkyBlue]@the_alien:  int test = dbaction.oeffneDBUndLies(this.getContext(), "numberOfVehicle");[/COLOR]
    }
    [/FONT]
    Das Programm läuft hier rein:

    Code:
    public int oeffneDBUndLies(Context context, String variablenname){
            dbsqlstatement = new DbSQLStatement(context); 
            int liesWert;
              try {
                  [COLOR=Red]liesWert = cursorMitSQLBefuellen(variablenname); [/COLOR]
                 //liesWert = liesDBAus(cursor); 
              } finally {
                  
              }
            return liesWert;
        }
    
    und befüllt auch den Cursor. Doch leider findet er die Einträge in der Datenbank nicht, und überspringt die Zeilen:

    Code:
    while(cursor.moveToNext()){
                     liesWert = (int) cursor.getLong(0);
                  }
    
    als wäre die DB leer. Ist sie aber nicht, denn:

    Wenn ich in der vorgeschalteten Activity, wie sixi vorgeschlagen hat, die Abfrage NACH der onCreate() mit Context noch mal durchführe, dann klappt es. Leider zu spät, da dann der Panel-Konstruktor schon gelaufen ist. Also scheint der Context WÄHREND die onCreate noch läuft unvollständig zu sein.

    Fällt Euch vielleicht auf, woran das liegen könnte, und ob man es trotzdem machen kann? :(
    Denn eigentlich geht es mir nur darum, dass der User in meinem Spiel Optionen wählen kann, die dann in der SurfaceView die notwendigen Variablen initialisieren. Vielleicht geht das ja anders auch viel besser?
     
    Zuletzt bearbeitet: 23.08.2011
  7. Duckemai, 24.08.2011 #7
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    Beiträge:
    227
    Erhaltene Danke:
    6
    Registriert seit:
    05.04.2010
    Phone:
    Nexus
    Ok. Habe eine Lösung gefunden. Statt im Panelkonstruktor der SurfaceView zu initialisieren, habe ich die Initialisierung nach hinten verlagert in die onStart() der Activity. Dort funzt die DB ja.

    Vielen Dank für die Hilfe
    Duckemai
     

Diese Seite empfehlen