Verständnisfrage Activities/ Klassen

R

rka7

Neues Mitglied
0
Hallo, ich bin PL/SQL Entwickler und habe auch ein wenig Java Erfahrung.
Nun versuche ich mich in der Android Entwicklung.

So wie ich das verstanden habe sind Activities sozusagen Bildschirm-Masken mit entsprechendem Code.
Soweit klar.
Nun bin ich gewohnt, sauberen Code zu erstellen. Also dachte ich dass meine Activity Klasse nur so
das Hauptgerüst sein soll, den Rest wollte ich in "normale" Java Klassen auslagern.
DB Zugriff usw. wäre dann auch in der ausgelagerten Klasse. Dies funktioniert mal schon gar nicht.
Der DB Zugriff funktioniert in der Activity Klasse einwandfrei, in der ausgelagerten Java Klasse passt dann irgend ein Kontext nicht.
Na gut, dann lassen wir den DB Zugriff halt in der Activity Klasse.

Meine Activity Klasse enthält zur Hauptsache einen Button OnClickListener
Darin habe ich mir eine Ereinis Klasse gebaut, die macht DB Zugriffe, Webservice Requests usw.
Darin läuft 90% der Logik ab. Funktioniert soweit ok.
Sieht also grob in etwas so aus:
Code:
public class PhotosActivity extends Activity {  
    
    public void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				setContentView(R.layout.photos_layout);
	
        SQLiteOpenHelper database = new DatabaseHelper (this);
        final SQLiteDatabase connection = database.getWritableDatabase();

	Button speichern = (Button) findViewById(R.id.buttonSpeichern);	
	speichern.setOnClickListener(new OnClickListener()
        {
	  @Override
          public void onClick(View v)
          {      
           
            //... Dabei stelle ich auch eine "interne" Ereingis-Klasse zur Verfügung, 
            //... die macht DB Zugriffe, Webservice Requests usw.
            class Ereignis {  
            	Cursor result=connection.rawQuery("select dies und jenes from ereignisse", null);
            	//...
            }
            
            //... Das Ereignis wird dann natürlich instanziert und macht eigentlich alles korrekt
            //... (eigentlich wollte ich diese Klasse eben als externe, "normale" Java Klasse 
            //.... haben, aber egal....
            Ereignis e = new Ereignis(....
            //... usw.
          }
So, nun habe ich aber noch die restlichen 10%, die aber mit dem Button OnClickListener nichts zu tun haben.
Beispielsweise möchte ich beim Aufstarten der ganzen Activity auch dieselbe ereignisse Tabelle lesen und da Daten synchronisieren.
Den DB Zugriff habe ich innerhalb des Button OnClickListener schön in einer Ereignisse Klasse gekapselt.
Ich habe mir nun gedacht dass ich die die Ereinisklasse ganz einfach nach dem onCreate der Activity instanzieren kann.
Geht aber nicht, Compiler meint dass er da keine Ereingisklasse finden kann.
Die Ereignisklasse rausziehen aus dem Button OnClickListener zum Activity onCreate geht auch nicht, dann kann der das Ereingis innerhalb des Button OnClickListener nicht mehr auffinden.
Es ist zum verzweifeln.
Konnte ich hier mein Problem so halbwegs klar aufzeigen?
Kann mir da vielleicht jemand grundsätzliche Angaben machen wie ich so eine Ereingis-Klasse (mit DB Zugriff) bereitstellen kann
und diese dann auf Ebene onCreate sowie auf Ebene Button-OnClickListener verwenden kann
?
Vielen Dank
rka
 
Die innere Klasse Ereignis kann nicht in der Methode onClick() definiert werden.
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

In der Methode onClick wird Ereignis ausgelöst. In der Methode steht sowas wie:
Code:
public void onClick(View v) {[INDENT]Ereignis ereignis = new Ereignis (mContext);
ereignis.tuDies();

// oder man ruft eine Methode der Activity auf

startNewActivity();
[/INDENT]}
Das ist nur ein Beispiel.

Wie man unter Android mit Events umgeht: Input Events | Android Developers
oder schau mal dort nach: Googles Android/ Activities. Hier werden ganz kurz ein paar Sachen zu Activity erklärt.
 
Zuletzt bearbeitet:
Vielen Dank für diese Erklärung.
Habe bei Vogella eine recht gute Schritt-Fuer-Schritt Anleitung diesbezüglich gefunden.
 
Im übrigen kannst du sehr wohl Datenbankzugriffe in eine eigene Klasse auslagern.

Du musst halt nur beim Aufruf den entsprechenden Context mit übergeben.
Code:
class Datenbankklasse {
    private final SQLiteDatabase connection;

    public Datenbankklasse(Context context) {
        SQLiteOpenHelper database = new DatabaseHelper (context);         
        this.connection = database.getWritableDatabase();
    }
}
Damit hast du dann in deiner Datenbankklasse ein connection object mit dem du arbeiten kannst.

Aufrufen kannst du das dann aus der Activity z.B. mit:
Datenbankklasse dbclass = new Datenbankklasse(this);

this ist in diesem Fall die Activity, und Activity erbt (über mehrere Ebenen) von Context, ist also selbst ein Context, den du hier dann übergeben kannst.

Damit kannst du wunderbar deinen Datenbank Code wegkapseln.

Noch bessere wäre es sogar, wenn du die Datenbankklasse nur als Interface baust dann kannst du theoretisch sogar irgendwann die lokale Datenbank gegen z.B. eine Datenbank im Web austauschen aber ob du das wirklich brauchst ist eine andere Fragen ;)
 

Ähnliche Themen

M
Antworten
3
Aufrufe
855
maksimilian
M
W
Antworten
1
Aufrufe
850
jogimuc
J
N
  • no1Ltan
Antworten
0
Aufrufe
838
no1Ltan
N
Zurück
Oben Unten