1. Duckemai, 22.08.2011 #1
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    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

    Erstell dir einen eigenen Constructor dem du zusätzlich den Context übergibst, wenn du das Panel erzeugst.
     
    Duckemai gefällt das.
  3. Duckemai, 23.08.2011 #3
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    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

    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 gefällt das.
  5. the_alien, 23.08.2011 #5
    the_alien

    the_alien Android-Lexikon

    Was genau ist denn ein Panel? Ein View wird ja auch immer mit einem Context erstellt und über getContext() bekommt man den...
     
    Duckemai gefällt das.
  6. Duckemai, 23.08.2011 #6
    Duckemai

    Duckemai Threadstarter Erfahrener Benutzer

    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

    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
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
[ERLEDIGT] Spinner feste double Werte zuordnen Android App Entwicklung 24.04.2017
[ERLEDIGT] In SQLite DB auf nächsten/vorherigen Datensatz zugreifen Android App Entwicklung 23.03.2017
Display-Breite zum App-Start auslesen Android App Entwicklung 11.03.2017
Excel Dokument mithilfe von JExcelAPI auslesen funktioniert nicht :/ Android App Entwicklung 02.03.2017
[APPINVENTOR] Wie weise ich Werte aus Slidern zu ? Android App Entwicklung 07.02.2017
SQLite auslesen und in Tabelle darstellen Android App Entwicklung 12.10.2016
Textfeld in einer App auslesen Android App Entwicklung 02.10.2016
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) Android App Entwicklung 24.08.2016
Sensoren bzw Infos auslesen. Android App Entwicklung 05.08.2016
Du betrachtest das Thema "DB-Werte in Panel auslesen" im Forum "Android App Entwicklung",