Android Verständnisfrage Activities/Klassen

rka

Neues Mitglied
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:
Java:
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
? :bahnhof:
Vielen Dank
rka
 

dzim

Top Contributor
Hast du dir eigentlich schon mal überhaupt ein einziges Tutorial durchgelesen?
Android braucht für vieles die "Context"-Klasse. Das ist in diesem Fall deine Activity (die erweitert Context einfach).

Da die Datenbank Kontextabhängig ist (jede App hat, wenn überhaupt, seine eigene(n) Datenbank(n) - das ist auch physisch so zu verstehen, denn jede App hat bei bedarf eine (oder mehrere) eigene sqlite-Datei(n)).

Liess dir die Tutorials von Lars Vogel einmal durch:
Android Development

Und da du speziell an der DB herumjammerst:
Android SQLite database and content provider - Tutorial

Wenn du deinen ContentProvider und deinen SQLiteOpenHelper implementiert und registriert (oder im Fall des Helper einfach nur referenziert hast), dann kannst du dir eine Hilfsklasse für den Datenbankzugriff bauen. Nennen wir es eine DAO-Klasse.

Ich habe mich dazu eines älteren (und als unsaubere bezeichnetes) Konzeptes zugewandt:
Java:
public class DBAccess {
	
	private static final Map<Class<? extends Context>, DBAccess> contextBasedAccess = new HashMap<Class<? extends Context>, DBAccess>();
	
	public static final DBAccess getInstance(final Context context) {
		if (context == null) {
			return null;
		}
		DBAccess access = contextBasedAccess.get(context.getClass());
		if (access == null) {
			access = new DBAccess(context);
			contextBasedAccess.put(context.getClass(), access);
		}
		return access;
	}
	
	private final Context mContext;
	
	private DBAccess(final Context context) {
		this.mContext = context;
	}
	
	public Context getContext() {
		return mContext;
	}

	public File getExportDir() {
		File publicDir = Environment.getExternalStorageDirectory();
		if (publicDir == null) {
			File exportDir = new File(mContext.getExternalFilesDir(null), Constants.EMPTY_STRING);
			if (!exportDir.exists()) {
				exportDir.mkdirs();
			}
			return exportDir;
		} else {
			File exportDir = new File(publicDir, Constants.DB_EXPORT_DIR);
			if (!exportDir.exists()) {
				exportDir.mkdirs();
			}
			return exportDir;
		}
	}

	public File getDatabaseFile() {
		return mContext.getDatabasePath(Constants.DB_NAME);
	}
	
	public File getInternalFilesDir() {
		File internalFilesDir = new File(mContext.getExternalFilesDir(null), Constants.EMPTY_STRING);
		if (!internalFilesDir.exists()) {
			internalFilesDir.mkdirs();
		}
		return internalFilesDir;
	}
	
	public File getInternalCacheDir() {
		File internalFilesDir = new File(mContext.getExternalCacheDir(), Constants.EMPTY_STRING);
		if (!internalFilesDir.exists()) {
			internalFilesDir.mkdirs();
		}
		return internalFilesDir;
	}

	// now: methods to query the DB via the ContentProvider
	// e.g.: Uri uri = mContext.getContentResolver().insert(ResultTable.CONTENT_URI, contentValues);
	// where uri is the internal content uri - search for it
	// contentValues are key-value-pairs in a ContentValues instance


	// for native you might need some minor hacks - ask for them if you REALLY need them...
	// ... I needed them :-p
}

So. Jetzt viel Spass mit den Tutorials.
 

rka

Neues Mitglied
Hallo und ja, ich habe schon einige Tutorials gelesen. Jeder schreibt was anderes, bei jedem funktioniert was anderes nicht ...
Ich habe sogar ein Buch in Parpierform
Nun denn, ich danke dir trotzdem für deine Hilfe. Die Lars Vogel Tutorials sind wirklich gut und laufen auch.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
Soloeco Android Multiple Activities - AndroidManifest Android & Cross-Platform Mobile Apps 4
S Android In allen Activities die selbe Toolbar Android & Cross-Platform Mobile Apps 1
G Android Kommunikation zwischen den Activities Android & Cross-Platform Mobile Apps 1
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
S Umgang mit mehreren Activities Android & Cross-Platform Mobile Apps 4
H Mehrere Activities (Android) Android & Cross-Platform Mobile Apps 4
E Übergang zwischen 2 Activities Android & Cross-Platform Mobile Apps 1
A Von verschiedenen Klassen auf Thread zugreifen Android & Cross-Platform Mobile Apps 2
ruutaiokwu Auto-Import der benötigten Klassen, wie bei Eclipse Ctrl-Shift-O Android & Cross-Platform Mobile Apps 9
S Auf Methode zugreifen von anderen Klassen Android & Cross-Platform Mobile Apps 6
P Android JUnit Testprojekt warum keine Java Klassen Android & Cross-Platform Mobile Apps 1
A Wie kommunizieren Klassen untereinander? Android & Cross-Platform Mobile Apps 2
H Android Klassen Android & Cross-Platform Mobile Apps 2
S Gemeinsame Klassen des JRE und Android..? Android & Cross-Platform Mobile Apps 3
H Android Verwendbare Klassen und icon Android & Cross-Platform Mobile Apps 4
D wie geht Klassenvererbung von Canvas Klassen Android & Cross-Platform Mobile Apps 2
U Programm um die Klassen darzustellen Android & Cross-Platform Mobile Apps 4
M Klassen-Referenz Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben