Eine Datenbank von 2 Activities nutzen (Lesen in Main und schreiben in Detail)

  • Antworten:2
  • Bentwortet
Gelöschter Account
  • Forum-Beiträge: 2

27.03.2020, 17:36:55 via Website

Hi Leute,

vlt könnt ihr mir helfen. Ich habe folgendes Problem bei der Erstellung meiner ersten App. Ich habe es hinbekommen, mithilfe eines Tutorials auf codeyourapp.de eine Datenbank zu erstellen und zumindest teilweise zu nutzen.

Mein Ziel ist es eine Kalender-App zu programmieren. Dort möchte ich in der MainActivity eine CalenderView sehen und darunter eine TextView in dem die eingetragenen Termine am jeweiligen Tag zu sehen sind. Durch den Plus-Button soll die CalendarActivity geöffnet werden und die dort getätigten Einträge in die Datenbank geschrieben werden. Dies Klappt anscheinend bisher.
Leider habe ich ein Problem, von der MainActivity aus, auf die Datenbank zu greifen zu können. Ich bekommen hier immer wieder eine Nullpointer-reference.

Meine Frage ist nun wie überprüfe ich in der MainActivity ob sich die Datenbank verändert hat und wie lese ich dort am sinnvollsten die Daten wieder aus?

Ich hoffe ihr könnt mir helfen :)
Grüße

cnc24

ps: code stelle ich von den 3 Java-Klassen zur Verfügung.

MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private CalendarEntriesDataSource dataSource;
private static final String LOG_TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initializeToolbar();
    initializeButtons();
    initializeViews();
    initializeDataSource();
}


//System und Eingabe-Methoden zur Steuerung von Verhalten der Applikation
@Override
protected void onPause() {
    super.onPause();
    dataSource.close();
}

@Override
protected void onResume() {
    super.onResume();

    dataSource.open();
}

@Override
public void onClick(View view) {

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

//Eigene Methoden zur initialisierung von View-Objekten und Datenquellen
public void initializeToolbar(){
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

public void initializeMenu(){

}

public void initializeViews(){
    CalendarView cal_view = findViewById(R.id.calendarView);
    cal_view.setFirstDayOfWeek(Calendar.MONDAY);

    TextView tv_time = findViewById(R.id.time);
    tv_time.setText("10:20 Uhr");

    TextView tv_description = findViewById(R.id.description);
    tv_description.setText("Dies ist eine Testbeschreibung");
}

public void initializeButtons(){
    FloatingActionButton fab = findViewById(R.id.addButton);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           startActivity(new Intent(MainActivity.this, CalendarActivity.class));
        }
    });
}

public void initializeDataSource(){
    dataSource = new CalendarEntriesDataSource(this);

}

}

CalendarActivity
public class CalendarActivity extends AppCompatActivity implements View.OnClickListener {

private static final String LOG_TAG = CalendarActivity.class.getSimpleName();


private EditText et_title, tv_dateStart, tv_dateEnd, tv_timeStart, tv_timeEnd,tv_description;
private Switch sw_wholeDayEvent, sw_privateEvent;
private CalendarEntriesDataSource dataSource;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_detail);

    initializeToolbar();
    initializeViews();
    initializeSwitches();
    initializeDataSource();

}

@Override
protected void onPause() {
    super.onPause();
    dataSource.close();
}

@Override
protected void onResume() {
    super.onResume();
    dataSource.open();
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.date_start:
        case R.id.date_end:
        case R.id.time_start:
        case R.id.time_end:
        case R.id.description:
            Editable ed_description = tv_description.getText();
            String content = ed_description.toString();
            CalendarEntries test = dataSource.createCalendarEntry( "Test", "12.12.12", "12,12,12", "11", "12", content, true, true);
            Log.d(LOG_TAG, test.toString());
            return;
        default:
            Log.d(LOG_TAG, "onClick erfolgreich aufgerufen");
    }


}

public void initializeToolbar(){
    Toolbar toolbar = findViewById(R.id.toolbar2);
    setSupportActionBar(toolbar);
}
public void initializeViews(){
    et_title = findViewById(R.id.title);
    tv_dateStart = findViewById(R.id.date_start);
    tv_dateStart.setOnClickListener(this);

    tv_dateEnd = findViewById(R.id.date_end);
    tv_dateEnd.setOnClickListener(this);

    tv_timeStart = findViewById(R.id.time_start);
    tv_timeStart.setOnClickListener(this);

    tv_timeEnd = findViewById(R.id.time_end);
    tv_timeEnd.setOnClickListener(this);

    tv_description = findViewById(R.id.description);
    tv_description.setEnabled(true);
    tv_description.setOnClickListener(this);


}
public void initializeSwitches(){
    sw_wholeDayEvent = findViewById(R.id.wholeDaySwitch);
    sw_privateEvent = findViewById(R.id.privateSwitch);
}

public void initializeDataSource(){
    dataSource = new CalendarEntriesDataSource(this);
}

}

CalendarEntriesDbHelper
public class CalendarEntriesDbHelper extends SQLiteOpenHelper {

private static final String LOG_TAG = CalendarEntriesDbHelper.class.getSimpleName();

public static final String DB_NAME = "calendar.db";
public static final int DB_VERSION = 1;

public static final String TABLE_TERMINE = "termine";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "titel";
public static final String COLUMN_DATE_START = "datum_anfang";
public static final String COLUMN_DATE_END = "datum_ende";
public static final String COLUMN_TIME_START = "zeit_start";
public static final String COLUMN_TIME_END = "zeit_ende";
public static final String COLUMN_WHOLEDAY = "ganztaegig";
public static final String COLUMN_PRIVATE = "privates_event";
public static final String COLUMN_DESCRIPTION = "beschreibung";

public static final String SQL_CREATE = "CREATE TABLE "+ TABLE_TERMINE+"("+
                                        COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
                                        COLUMN_TITLE + " TEXT NOT NULL, " +
                                        COLUMN_DATE_START + " TEXT NOT NULL, " +
                                        COLUMN_DATE_END +" TEXT NOT NULL, " +
                                        COLUMN_TIME_START + " TEXT NOT NULL, " +
                                        COLUMN_TIME_END + " TEXT NOT NULL, " +
                                        COLUMN_DESCRIPTION + " TEXT DEFAULT NULL, " +
                                        COLUMN_WHOLEDAY + " BOOLEAN NOT NULL DEFAULT 0, " +
                                        COLUMN_PRIVATE + " BOOLEAN NOT NULL DEFAULT 0 );";

public static final String SQL_DROP = "DROP TABLE IF EXISTS " + TABLE_TERMINE;

public CalendarEntriesDbHelper(Context context){
    super(context, DB_NAME, null, DB_VERSION);
    Log.d(LOG_TAG, "DbHelper hat die Datenbank: "+getDatabaseName()+ " erzeugt.");
}

// Die onCreate-Methode wird nur aufgerufen, falls die Datenbank noch nicht existiert
@Override
public void onCreate(SQLiteDatabase db) {
    try {
        Log.d(LOG_TAG, "Die Tabelle wird mit dem SQL-Befehl: "+SQL_CREATE+ " angelegt.");
        db.execSQL(SQL_CREATE);
    }catch (Exception ex){
        Log.e(LOG_TAG, "Fehler beim Anlegen der Tabelle: "+ex.getMessage()+"\n"+ex.getStackTrace());
    }
}

// Die onUpgrade-Methode wird aufgerufen, sobald die neue Versionsnummer höher
// als die alte Versionsnummer ist und somit ein Upgrade notwendig wird
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.d(LOG_TAG, "Die Tabelle mit der Versionsnummer " +oldVersion + " wird entfernt.");
    db.execSQL(SQL_DROP);
    onCreate(db);

}

}

CalendarEntriesDataSource
private static final String LOG_TAG = CalendarEntriesDataSource.class.getSimpleName();

private SQLiteDatabase database;
private CalendarEntriesDbHelper dbHelper;
private String[] columns ={
        CalendarEntriesDbHelper.COLUMN_ID,
        CalendarEntriesDbHelper.COLUMN_TITLE,
        CalendarEntriesDbHelper.COLUMN_DATE_START,
        CalendarEntriesDbHelper.COLUMN_DATE_END,
        CalendarEntriesDbHelper.COLUMN_TIME_START,
        CalendarEntriesDbHelper.COLUMN_TIME_END,
        CalendarEntriesDbHelper.COLUMN_DESCRIPTION,
        CalendarEntriesDbHelper.COLUMN_WHOLEDAY,
        CalendarEntriesDbHelper.COLUMN_PRIVATE
};

public CalendarEntriesDataSource(Context context){
    Log.d(LOG_TAG, "Unsere DataSource erzeugt jetzt den dbHelper.");
    dbHelper = new CalendarEntriesDbHelper(context);
}

public void open(){
    Log.d(LOG_TAG, "Eine Referenz auf die Datenbank wird jetzt angefragt.");
    database = dbHelper.getWritableDatabase();
    Log.d(LOG_TAG, "Datenbank-Referenz erhalten. Pfad zur Datenbank: " + database.getPath());
}

public void close() {
    dbHelper.close();
    Log.d(LOG_TAG, "Datenbank mit Hilfe des DbHelpers geschlossen.");
}

public CalendarEntries createCalendarEntry(String title, String dateStart, String dateEnd, String timeStart,
                                           String timeEnd, String description, boolean wholeDayEvent, boolean privateEvent){
    ContentValues values = new ContentValues();
    values.put(CalendarEntriesDbHelper.COLUMN_TITLE, title);
    values.put(CalendarEntriesDbHelper.COLUMN_DATE_START, dateStart);
    values.put(CalendarEntriesDbHelper.COLUMN_DATE_END, dateEnd);
    values.put(CalendarEntriesDbHelper.COLUMN_TIME_START, timeStart);
    values.put(CalendarEntriesDbHelper.COLUMN_TIME_END, timeEnd);
    values.put(CalendarEntriesDbHelper.COLUMN_DESCRIPTION, description);
    values.put(CalendarEntriesDbHelper.COLUMN_WHOLEDAY, wholeDayEvent);
    values.put(CalendarEntriesDbHelper.COLUMN_PRIVATE, privateEvent);

    long insertId = database.insert(CalendarEntriesDbHelper.TABLE_TERMINE, null, values);

    Cursor cursor = database.query(CalendarEntriesDbHelper.TABLE_TERMINE, columns, CalendarEntriesDbHelper.COLUMN_ID +"="+insertId,
            null, null, null, null);

    cursor.moveToFirst();
    CalendarEntries calendarEntries = cursorToCalendarEntries(cursor);
    cursor.close();

    return calendarEntries;
}

public CalendarEntries getCalendarEntry(){
    Log.d(LOG_TAG,database.getPath());
    //Cursor cursor = database.query(CalendarEntriesDbHelper.TABLE_TERMINE, columns,null,null,null,null,null);

    CalendarEntries calendarEntries = null;

    return calendarEntries;

}

private CalendarEntries cursorToCalendarEntries(Cursor cursor) {
    int idIndex = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_ID);
    int idTitle = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_TITLE);
    int idDateStart = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_DATE_START);
    int idDateEnd = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_DATE_END);
    int idTimeStart = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_TIME_START);
    int idTimeEnd = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_TIME_END);
    int idDescription = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_DESCRIPTION);
    int idWholeDay = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_WHOLEDAY);
    int idPrivate = cursor.getColumnIndex(CalendarEntriesDbHelper.COLUMN_PRIVATE);

    String title = cursor.getString(idTitle);
    String dateStart = cursor.getString(idDateStart);
    String dateEnd = cursor.getString(idDateEnd);
    String timeStart = cursor.getString(idTimeStart);
    String timeEnd = cursor.getString(idTimeEnd);
    String description = cursor.getString(idDescription);

    long id = cursor.getLong(idIndex);
    int intWholeDay = cursor.getInt(idWholeDay);
    int intPrivateEvent = cursor.getInt(idPrivate);

    boolean wholeDay = (intWholeDay != 0);
    boolean privateEvent = (intPrivateEvent != 0);

    CalendarEntries calendarEntries = new CalendarEntries(id, title,dateStart, dateEnd, timeStart,timeEnd,wholeDay, privateEvent,description);

    return calendarEntries;
}

}

— geändert am 27.03.2020, 17:41:36

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

27.03.2020, 18:35:35 via Website

Hallo und Wilkommen im Forum.

Zu deiner Frage, eigentlich genauso wie in der zweiten Activity.

Wie ich Sehe hast du ja eine Helper Klasse und eine in der du die Bearbeitung machst.
Mit diesem Befehl in der zweiten Activty erstellst du zwar eine DB.

"dataSource = new CalendarEntriesDataSource(this);"

Aber mehr passiert nicht.

Kein öffnen der DB.
Kein Schreiben der Daten in der DB.
Kein Lesen aus der DB.

Das Alles hast du schon in deinem Code nur benutzen tust du es nicht.

Wenn du der der zweiten Activity zu ersten gehst solltest du die DB schlissen und in der Main halt wieder öffnen. Und die Daten aus lesen.

Hilfreich?
Gelöschter Account
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 2

27.03.2020, 18:46:40 via Website

Vielen Dank, ein "dataSource.open()" in der MainActivity sorgte dafür das es klappte :)

War verwirrt, da ich in der zweiten CalendarActivity die Datenbank nicht explizit geöffnet habe, sondern das open einfach in der onResume-Methode stehen hatte, und es trotzdem funktionierte Daten rein zuschreiben.

Vielen dank aber für die Antwort :)

Hilfreich?
Kommentieren