Nee, ich denke schon das ich die werte in die richtigen spalten zugewiesen habe. Ich denke eher das der fehler beim auslesen der daten aus dem Arraylist<hashmap> lag. Bin mir auch nicht sicher und ehrlich gesagt wurde es mir zu kompliziert (obwohl das eigentlich ja nicht so schwer ist) und war am ende nur noch durcheinander. Jetzt mache ich es ohne irgendwelche Arraylist<hashmap>.
Zum Fehler:
Finden aus dem logcat ist nicht das problem, aber warum die angegebene zeile aus dem logcat ein fehler ist, das ist ja der knackpunkt, weil ich der meinung bin das ich alles richtig gemacht habe und komme einfach nicht auf die lösung.
Ich poste das mal kurz wenn es ok ist:
Mein MainActivity:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
SectionsPagerAdapter mySectionsPagerAdapter;
ViewPager myViewPager;
ActionBar myactionBar;
Schuldner fr_schuldner;
Begunstigter fr_begunstigter ;
public DataBaseHandler myDBHandler;
// ------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myactionBar = getActionBar();
myactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setSectionsPagerAdapter();
initActionbar();
initFragments();
openDB();
populateListViewFromDB();
}
// ------------------------------------------------------------------------
private void setSectionsPagerAdapter() {
mySectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
myViewPager = (ViewPager) findViewById(R.id.pager);
myViewPager.setAdapter(mySectionsPagerAdapter);
myViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
myactionBar.setSelectedNavigationItem(position);
}
});
}
// ------------------------------------------------------------------------
private void initActionbar() {
for (int i = 0; i < mySectionsPagerAdapter.getCount(); i++) {
myactionBar.addTab(myactionBar.newTab()
.setText(mySectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
}
// ------------------------------------------------------------------------
private void initFragments() {
fr_schuldner = (Schuldner)mySectionsPagerAdapter.getItem(0);
fr_begunstigter = (Begunstigter)mySectionsPagerAdapter.getItem(1);
}
// ------------------------------------------------------------------------
private void openDB() {
myDBHandler = new DataBaseHandler(this);
myDBHandler.open();
//Log.e("FEHLER", "" + myDBHandler.getContactsCount());
}
private void closeDB() {
myDBHandler.close();
}
// ------------------------------------------------------------------------
private void populateListViewFromDB() {
fr_schuldner.populateListViewFromDB();
}
public void cursorManaging() {
Cursor cursor = myDBHandler.getAllRows();
startManagingCursor(cursor);
}
// ------------------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// ------------------------------------------------------------------------
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
myViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
// ------------------------------------------------------------------------
@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}
// ------------------------------------------------------------------------
}
Alles anzeigen
Fragment Schuldner
public class Schuldner extends Fragment {
public static String ARG_SECTION_NUMBER = "section_number";
ListView listView;
TextView verliehenesGeld;
float _betrag = 0;
float gesamt = 0;
int iconID;
EditText eintrag_name, eintrag_betrag, eintrag_grund;
String name = "";
String grund = "";
String datum = "";
MainActivity mainActivity = (MainActivity)getActivity();
GetDate date;
public Schuldner(int position) {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_schuldner, container, false);
listView = (ListView)v.findViewById(R.id.listView1);
verliehenesGeld = (TextView)v.findViewById(R.id.textView1);
verliehenesGeld.setText(null);
return v;
}
// --------------------------------------------------------------------
public void btnClick_SchulderEintragen(View v) { //Button Klick to Add Schuldner
openDialog();
}
// --------------------------------------------------------------------
private void openDialog() { //Dialog erstellen
final Dialog dialog = new Dialog(getActivity());
dialog.setContentView(R.layout.dialog1);
dialog.setTitle("Schulden Hinzufügen");
dialog.setCancelable(false);
eintrag_name = (EditText)dialog.findViewById(R.id.editText_name);
eintrag_betrag = (EditText)dialog.findViewById(R.id.editText_betrag);
eintrag_grund = (EditText)dialog.findViewById(R.id.editText_grund);
Button hinzufügen = (Button)dialog.findViewById(R.id.button2);
Button abbrechen = (Button)dialog.findViewById(R.id.button1);
hinzufügen.setOnClickListener(new OnClickListener() { //Buttonklick Hinzufügen
@Override
public void onClick(View v) {
name = eintrag_name.getText().toString();
_betrag = Float.valueOf(eintrag_betrag.getText().toString());
grund = eintrag_grund.getText().toString();
datum = date.returnDate();
iconID = R.drawable.user_image3;
mainActivity.myDBHandler.insertRow(name, _betrag, grund, datum);
populateListViewFromDB();
dialog.dismiss();
}
});
// --------------------------------------------------------------------
abbrechen.setOnClickListener(new OnClickListener() { //Buttonklick Abbrechen
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
// --------------------------------------------------------------------
@SuppressWarnings("deprecation")
public void populateListViewFromDB() { //ListView mit Werten aus der db befüllen
Cursor cursor = mainActivity.myDBHandler.getAllRows();
mainActivity.cursorManaging();
String[] dbSpaltenNamen = new String[] {DataBaseHandler.KEY_NAME, //die spalteneinträge wie
DataBaseHandler.KEY_BETRAG, //angeordnet in die jeweiligen
// DataBaseHandler.KEY_GRUND, //id's des custom listzeile zuordnen
DataBaseHandler.KEY_DATUM};
int[] zuListViewIDs = new int[] {R.id.txt_name, //hier die id's. name zu name
R.id.txt_betrag, //betrag zu betrag...
R.id.datum};
SimpleCursorAdapter myCursorAdapter
= new SimpleCursorAdapter
(getActivity(), R.layout.list_zeile, cursor, dbSpaltenNamen, zuListViewIDs);
listView.setAdapter(myCursorAdapter);
}
private float gesamtSchulden(EditText betrag) {
gesamt += Float.valueOf(betrag.getText().toString());
return gesamt;
}
}
Alles anzeigen
und die DataBaseHandler KLasse:
public class DataBaseHandler {
private final Context context;
private DatabaseHelper myDataBHelper;
private SQLiteDatabase db;
public DataBaseHandler(Context ctx) {
this.context = ctx;
myDataBHelper = new DatabaseHelper(context);
}
// CONSTANTE
// For logging:
private static final String TAG = "DBAdapter";
// DB TABELLENSPALTEN
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_BETRAG = "betrag";
public static final String KEY_GRUND = "grund";
public static final String KEY_DATUM = "datum";
// TABELLEN SPALTEN NUMMER (ID = 0; NAME = 1,...)
public static final int COL_ROWID = 0;
public static final int COL_NAME = 1;
public static final int COL_BETRAG = 2;
public static final int COL_GRUND = 3;
public static final int COL_DATUM = 4;
public static final String[] ALL_KEYS = new String[] {KEY_ID, KEY_NAME, KEY_BETRAG, KEY_GRUND, KEY_DATUM};
// DB NAME UND TABLE NAME UND DB VERSION
public static final String DATABASE_NAME = "MyDb";
public static final String DATABASE_TABLE = "schuldnerTable";
public static final int DATABASE_VERSION = 1;
// SQL-ANWEISUNG FÜR DIE TABELLENERSTELLUNG
private static final String DATABASE_CREATE_SQL =
"create table " + DATABASE_TABLE
+ " (" + KEY_ID + " integer primary key autoincrement, "
+ KEY_NAME + " text not null, "
+ KEY_BETRAG + " float not null, "
+ KEY_GRUND + " text not null, "
+ KEY_DATUM + " text not null"
+ ");";
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// DB VERBINDUNG ÖFFNEN/HERSTELLEN
public DataBaseHandler open() {
db = myDataBHelper.getWritableDatabase();
return this;
}
// DB VERBINDUNG SCHLIEßEN
public void close() {
myDataBHelper.close();
}
// NEUE ZEILE MIT WERTEN EINFÜGEN
public long insertRow(String name, float betrag, String grund, String datum) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_BETRAG, betrag);
initialValues.put(KEY_GRUND, grund);
initialValues.put(KEY_DATUM, datum);
// DB EINTRAG
return db.insert(DATABASE_TABLE, null, initialValues);
}
// EINE ZEILE NACH DER ID UPDATEN/AKTUALISIEREN
public boolean updateRow(long rowId, String name, float betrag, String grund, String datum) {
String where = KEY_ID + "=" + rowId;
ContentValues newValues = new ContentValues();
newValues.put(KEY_NAME, name);
newValues.put(KEY_BETRAG, betrag);
newValues.put(KEY_GRUND, grund);
newValues.put(KEY_DATUM, datum);
// DB EINTRAG
return db.update(DATABASE_TABLE, newValues, where, null) != 0;
}
// EINE SPEZIFISCHE ZEILE NACH DER ID AUSGEBEN
public Cursor getRow(long rowId) {
String where = KEY_ID + "=" + rowId;
Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
// ALLE ZEILEN DER DB-TABELLE AUSGEBEN
public Cursor getAllRows() {
String where = null;
Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
// ZEILE LÖSCHEN NACH DER ID LÖSCHEN
public boolean deleteRow(long rowId) {
String where = KEY_ID + "=" + rowId;
return db.delete(DATABASE_TABLE, where, null) != 0;
}
// ALLE ZEILEN UND WERTE LÖSCHEN
public void deleteAll() {
Cursor c = getAllRows();
long rowId = c.getColumnIndexOrThrow(KEY_ID);
if (c.moveToFirst()) {
do {
deleteRow(c.getLong((int) rowId));
} while (c.moveToNext());
}
c.close();
}
// ANZAHL DER EINTRÄGE WIEDERGEBEN
public int getContactsCount() {
String countQuery = "SELECT * FROM " + DATABASE_TABLE;
SQLiteDatabase db = myDataBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// int count = cursor.getCount();
// cursor.close();
// db.close();
// return count;
// return count
return cursor.getCount();
}
//-------------------------------------------------------------------------
//----------------------------SUBKLASSE---------------------------------------------
public static class DatabaseHelper extends SQLiteOpenHelper {
// KONSTRUKTOR
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// TABELLE WIRD ERZEUGT
@Override
public void onCreate(SQLiteDatabase _db) {
_db.execSQL(DATABASE_CREATE_SQL);
}
// TABELLE WIRD AKTUALISIERT
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading application's database from version " + oldVersion
+ " to " + newVersion + ", which will destroy all old data!");
// LÖSCHE ALTE DB
_db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
// ERSTELLE NEUE DB
onCreate(_db);
}
}
}
Alles anzeigen
die logcat:
12-27 15:07:46.232: E/AndroidRuntime(20692): FATAL EXCEPTION: main
12-27 15:07:46.232: E/AndroidRuntime(20692): java.lang.RuntimeException: Unable to start activity ComponentInfo{debtmanager.mainfolder/debtmanager.mainfolder.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT * FROM schuldnerTable
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2098)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread.access$600(ActivityThread.java:138)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.os.Handler.dispatchMessage(Handler.java:99)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.os.Looper.loop(Looper.java:137)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread.main(ActivityThread.java:4872)
12-27 15:07:46.232: E/AndroidRuntime(20692): at java.lang.reflect.Method.invokeNative(Native Method)
12-27 15:07:46.232: E/AndroidRuntime(20692): at java.lang.reflect.Method.invoke(Method.java:511)
12-27 15:07:46.232: E/AndroidRuntime(20692): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-27 15:07:46.232: E/AndroidRuntime(20692): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-27 15:07:46.232: E/AndroidRuntime(20692): at dalvik.system.NativeStart.main(Native Method)
12-27 15:07:46.232: E/AndroidRuntime(20692): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT * FROM schuldnerTable
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:58)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
12-27 15:07:46.232: E/AndroidRuntime(20692): at database.DataBaseHandler.getContactsCount(DataBaseHandler.java:157)
12-27 15:07:46.232: E/AndroidRuntime(20692): at debtmanager.mainfolder.MainActivity.openDB(MainActivity.java:83)
12-27 15:07:46.232: E/AndroidRuntime(20692): at debtmanager.mainfolder.MainActivity.onCreate(MainActivity.java:39)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.Activity.performCreate(Activity.java:5191)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
12-27 15:07:46.232: E/AndroidRuntime(20692): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2037)
12-27 15:07:46.232: E/AndroidRuntime(20692): ... 11 more
12-27 15:07:55.302: I/Process(20692): Sending signal. PID: 20692 SIG: 9
Alles anzeigen
dort steht "attempt to re-open an already-closed.. ", was ich auch nicht verstehe. wenn die app abstürtzt oder normal beendet wird, wird die db geschlossen. beim ausführen der app sollte die db sich im geöffneten zustand wieder befinden. Verwirrung pur!