DB-Werte in Panel auslesen

D

Duckemai

Fortgeschrittenes Mitglied
6
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
 
Erstell dir einen eigenen Constructor dem du zusätzlich den Context übergibst, wenn du das Panel erzeugst.
 
  • Danke
Reaktionen: Duckemai
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:
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);
 
  • Danke
Reaktionen: Duckemai
Was genau ist denn ein Panel? Ein View wird ja auch immer mit einem Context erstellt und über getContext() bekommt man den...
 
  • Danke
Reaktionen: Duckemai
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:
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
 

Ähnliche Themen

R
  • RalfKahl
Antworten
10
Aufrufe
305
RalfKahl
R
5
Antworten
22
Aufrufe
1.422
590239
5
H
Antworten
2
Aufrufe
1.311
Hcman
H
Zurück
Oben Unten