1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

[GELÖST]Meine Datenbank bringt mich grad zum verzweifeln

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Micka, 17.06.2012.

  1. Micka, 17.06.2012 #1
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Hy,

    seit langem arbeite ich ja schon an meiner Seminararbeit für die Uni, der eine oder andere dürfte das Project evtl schon kennen.

    Nach meiner letzten Besprechung mit dem Prof. hieß es nun die Datenbank müsse normalisiert werden und ein DBMS soll genutzt werden.

    Über die Sinnigkeit des vom Prof vorgestellten DBMS kann man sich streiten, naja egal.

    Problem ist das folgende.

    Ich habe eine Klasse für jede Datenbanktabelle, für die Tabelle Listen sieht diese wie folgt aus:
    Code:
    package de.micka.lebenshilfe;
    
    import android.content.Context;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteDatabase;
    import android.util.Log;
    
    
    public class ListenDataManager extends SQLiteOpenHelper implements Constants
    {
        private static final String DATABASE_NAME = "de.micka.lebenshilfe.haushaltsbuchdb";
        private static final int DATABASE_VERSION = 1;
            
        /** Create a helper object for the database */
        public ListenDataManager(Context ctx) 
        { 
           super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
        }
        @Override
        public void onCreate(SQLiteDatabase db) 
        { 
           db.execSQL("CREATE TABLE " + LISTEN_TABLE_NAME + " (" 
                 + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "  
                 + LISTENNAME +" TEXT NOT NULL, "
                 + LISTENTYP + " TEXT NOT NULL );"
               );
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
        {
           db.execSQL("DROP TABLE IF EXISTS " + LISTEN_TABLE_NAME);
           onCreate(db);
        }
    }
    
    Die Klasse Constants, hieraus werden ja Spaltennamen genommen, sieht wie folgt aus:
    Code:
    package de.micka.lebenshilfe;
    
    import android.provider.BaseColumns;
    
    public interface Constants extends BaseColumns 
    {
        public static final String LISTEN_TABLE_NAME = "listen";
        public static final String EINTRAEGE_TABLE_NAME = "eintraege";
        // Spalten der Listen-Datenbank
        public static final String LISTENNAME = "LISTENNAME";
        public static final String LISTENTYP = "LISTENTYP";
        
        // Spalten der Eintraege-Datenbank
        public static final int DAY = 0;
        public static final int MONTH = 0;
        public static final int YEAR = 0;
        public static final String CATEGORY = "kategorie";
        public static final double AMOUNT = 0.00;
        public static long LISTID = 0;
    }
    
    Soweit so gut, in meiner Activity EintragHinzufügen möchte ich nun eine Liste eintragen, dafür gehe ich wie folgt vor.
    Code:
    private ListenDataManager listen;
    listen = new ListenDataManager(this);
    SQLiteDatabase db = listen.getWritableDatabase();
    ContentValues values = new ContentValues();
                values.put(LISTENNAME, listenname);
                values.put(LISTENTYP, listentyp);
                // Insert a new record
                db.insertOrThrow(LISTEN_TABLE_NAME, null, values); //ZEILE 232 der EintragHinzufuegen.java
    
    LISTENNAME und LISTENTYP sind in Constants deklariert, alle meine Klassen implementieren Constants. listenname und listentyp sind jeweils lokale variablen.
    Wenn ich das nun ausführe schmiert die APP ab und folgendes steht im LogCat:
    Kann mir jemand sagen warum es die Spalte LISTENTYP in meiner Tabelle nicht gibt? In der OnCreate des ListenDataManager wird doch genau diese tabelle angelegt.

    Der ursprüngliche Beitrag von 12:32 Uhr wurde um 12:43 Uhr ergänzt:

    Ich hab auch schon versucht es über die rawquery Variante zu machen wie ich es vorher hatte, aber da kommt seit der Datenbanktabellen Klasse der gleiche Fehler.

    Also statt
    habe ich
    versucht.
     
    Zuletzt bearbeitet: 19.06.2012
  2. Micka, 17.06.2012 #2
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Vielleicht liegt der Hund ja auch irgendwo anders begraben, aber davon gehe ich nicht aus. Aufjedenfall hänge ich an diesen Beitrag mal das komplette Project mit allen Source Dateien ran.
     

    Anhänge:

  3. swordi, 17.06.2012 #3
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hast du die spalte evtl erst später eingefügt ?

    die db wird nur einmal erstellt. wenn du etwas daran änderst, musst die app neu installieren. sonst kapierts das nicht
     
    Micka bedankt sich.
  4. Micka, 17.06.2012 #4
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Swordi mal wieder, Respekt. Scheinbar hab ich den Spaltennamen nochmal geändert gehabt. Danke dir. Nun hab ich allerdings das Problem, die Liste hat er sauber eingetragen er meckert nun das die tabelle nicht existiert....hab ich da einen ähnlichen Fehler?

    Hier nochmal der Source Code zu der Stelle:(Zeile 252 ist die erste Fett Markierte im Code)
    Code:
    public void onClickEintragSpeichern(final View sfNormal) 
        {    
            extrasAbrufen();
            listen = new ListenDataManager(this);
            SQLiteDatabase db = listen.getWritableDatabase();
            if(neueListe)
            {
                /*db.execSQL("INSERT INTO " + LISTEN_TABLE_NAME +" (LISTENNAME, LISTENTYP) "
                        +"VALUES ('" + listenname + "', '" + listentyp + "');");*/
                ContentValues values = new ContentValues();
                values.put(LISTENNAME, listenname);
                values.put(LISTENTYP, listentyp);
                // Insert a new record
                listenid = db.insertOrThrow(LISTEN_TABLE_NAME, null, values);
                /*Cursor cursor = db.rawQuery("SELECT _ID FROM " + LISTEN_TABLE_NAME + " WHERE LISTENNAME='" + listenname +"'" , null);
                listenid = cursor.getLong(0);*/
                System.out.println(listenid);
                db.close();
                listen.close();
            }
            eintraege = new EintraegeDataManager(this);
            db = eintraege.getWritableDatabase();
            Spinner wofuer = (Spinner) findViewById(R.id.hinzufuegen_zweck);
            EditText betrag = (EditText) findViewById(R.id.hinzufuegen_betrag);
            boolean betragcheck = false;
            //Extras abrufen
            extrasAbrufen();
            eintrag.wofuer = wofuer.getSelectedItem().toString();
            try 
            {
                eintrag.betrag = Double.parseDouble(betrag.getText().toString());
                db = eintraege.getWritableDatabase();
                //SQLiteDatabase db = this.openOrCreateDatabase(EINTRAEGE_TABLE_NAME, MODE_PRIVATE, null);
                [B]db.execSQL("INSERT INTO " + EINTRAEGE_TABLE_NAME +" (DAY, MONTH, YEAR, CATEGORY, AMOUNT, LISTID) " 
                        +"VALUES (" + eintrag.day + "," + eintrag.month+ "," + eintrag.year +", '" + eintrag.wofuer +"' ," + eintrag.betrag +",'" + listenid + "');");[/B]
                //Log.v(tag, "Insert new Eintrag: " + eintrag.day + "." +eintrag.month +"." + eintrag.year +", " + eintrag.wofuer + ", " + eintrag.betrag + ", id=" + eintrag._id + " in Liste: " + listenname);
                db.close();
                eintraege.close();
                final Intent i = new Intent(this, ListenAnsicht.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                i.putExtra(LISTENID, listenid);
                i.putExtra(LISTENTYPEXTRA, listentyp);
                //i.putExtra(GUTHABEN, tabellenGuthaben);
                finish();
                startActivity(i);
            }catch(NumberFormatException e)
            {
                Toast msg = Toast.makeText(EintragHinzufuegen.this, "Sie haben keinen Betrag eingegeben", Toast.LENGTH_LONG);
                msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
                msg.show();
            }    
        }
    
    und der neue LogCat:


    Der ursprüngliche Beitrag von 15:30 Uhr wurde um 15:30 Uhr ergänzt:

    Bedeutet das dass ich beide Tabellen, also die Tabelle eintraege und die Tabelle Listen über einen DataManager handhaben muss?
     
  5. Micka, 17.06.2012 #5
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Ich hab meine App jetzt dahingehen abgeändert das beide Tabellen in einem DataManager erstellt werden und dann klappt es. Die ganze Sache mit dem DataManager ist aus meiner Sicht bei dieser kleinen App nicht wirklich sinnig, aber damit muss ich mich wohl nun zurechtfinden.
     
  6. swordi, 17.06.2012 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    naja du brauchst ja nur eine datenbank - diese eine datenbank hat mehrere tabellen.

    eine datenbank - ein datamanager ( wie du es nennst )
     
    Micka bedankt sich.
  7. Micka, 18.06.2012 #7
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Dieses Problem ist nun erledigt, die Betonung liegt leider auf dieses.

    Meine App läuft nun, beim testen ist mir dann folgendes aufgefallen.

    Starte ich die App und lege eine Liste an ist alles in Ordnung, klappt alles.
    Starte ich die App ein zweites mal klappt der Start auch. Die angelegte liste kann ich mir anzeigen lassen, auch kein Problem. Will ich aber eine zweite Liste anlegen stürzt die App ab.

    Komisch daran, wenn ich in der App ins Textfeld für den Listennamen klicke ist noch alles okay, sobald ich aber eine Eingabe mache(oder die zurückTaste des Smartphones drücke, zwecks Tastatur ausblenden) stürzt die App ab und es wird eine NullPointerException in meinem ListAdapter geworfen. Ich versteh nicht wieso, die Liste wird zu Beginn einmal initiiert und dann sollte der List Adapter fertig sein. Was hat der ListAdapter mit dem Textfeld zur Eingabe zu tun? TextFeld und ListView sind in 2 unterschiedlichen Layouts.

    Hier nochmal die Klassen
    Meine Activity beim Start(ListenUebersicht.java)
    Code:
    package de.micka.lebenshilfe;
    
    
    import java.util.ArrayList;
    import android.app.ListActivity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.ContextMenu;
    import android.view.Gravity;
    import android.view.KeyEvent;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import android.widget.AdapterView.AdapterContextMenuInfo;
    import android.widget.Toast;
    
    public class ListenUebersicht extends ListActivity implements Constants {
        
        private ListenDataManager listen;
        private EintraegeDataManager eintraege;
        private HaushaltsbuchDataManager dataManager;
        private Liste liste;
        public static String LISTENID ="listenId";
        public static String LISTENNAME ="listenname";
        public static String LISTENTYPEXTRA = "listentyp";
        public static String NEUELISTE = "neueListe";
        public static final String ID = "id";
        private String listenname;
        private long listenid;
        private String listentyp;
        private View header = null;
        private ListView listView = null;
        private ListeListAdapter mAdapter;
        private ArrayList<Liste> mData = new ArrayList<Liste>();
        private Cursor tabelleCursor = null;
        private MenuInflater inflater;
        private AdapterContextMenuInfo info;
        private TextView txtview = null;
        private EditText newTable = null;
        private boolean neueListe = false;
        
        /** Called when the activity is first created. */
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            initiateData();        //Array-List für Listview füllen
            mAdapter = new ListeListAdapter(this, mData);
            header = getLayoutInflater().inflate(R.layout.uebersichttitellayout, null);
            listView = getListView();
            registerForContextMenu(listView);
            listView.addHeaderView(header);
            this.setListAdapter(mAdapter);
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish();
                return true;
            }
            return super.onKeyDown(keyCode, event);
        }
        private void tabelleLoeschen(long id)
        {
            dataManager = new HaushaltsbuchDataManager(this);
            SQLiteDatabase db = dataManager.getWritableDatabase();
            db.execSQL("DELETE FROM " + LISTEN_TABLE_NAME + " WHERE LISTID = '" + id + "';");
            db.execSQL("DELETE FROM" + EINTRAEGE_TABLE_NAME + " WHERE LISTID = '" + id + "';");
            db.close();
            dataManager.close();
            final Intent intent = new Intent(this, ListenUebersicht.class);
            finish();
            startActivity(intent);
        }
        public void tabelleBearbeiten(long tabid)
        {
            
                final Intent intent = new Intent(this, ListeBearbeiten.class);
                intent.putExtra(LISTENID, listenid);
                intent.putExtra(LISTENNAME, listenname);
                intent.putExtra(LISTENTYPEXTRA, listentyp);
                finish();
            startActivity(intent);
        }
        public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) 
        {
            super.onCreateContextMenu(menu, v, menuInfo);
            inflater = getMenuInflater();
            inflater.inflate(R.menu.tabellecontext, menu);
        }
        public boolean onContextItemSelected(MenuItem item) 
        {
          info = (AdapterContextMenuInfo) item.getMenuInfo();
          switch (item.getItemId()) {
          case R.id.tabelle_context_bearbeiten:
              tabelleBearbeiten(info.id);
               //Log.v(tag, mData.get(info.position-1).tabellenname);
              return true;
          case R.id.tabelle_context_loeschen:
              tabelleLoeschen(info.id);
              return true;
          default:
            return super.onContextItemSelected(item);
          }
        }    
        private void initiateData()
        {
            Log.i("Listenübersicht","initiate Data ");
            dataManager = new HaushaltsbuchDataManager(this);
                try {
                SQLiteDatabase db = dataManager.getReadableDatabase();
                Cursor cursor = db.rawQuery("SELECT " 
                                                    + _ID + ", " 
                                                    + LISTENNAME 
                                                    + " FROM "
                                                    + LISTEN_TABLE_NAME 
                                                    + " Order By listenname", null);
                startManagingCursor(cursor);
                    if(cursor.moveToFirst())
                    {
                        do
                        {
                            liste = null;
                            cursor.moveToFirst();
                            liste = new Liste(cursor.getInt(0),cursor.getString(1));
                            mData.add(liste);
                            cursor.moveToNext();
                        }while(cursor.isAfterLast() == false);
                    }
                    cursor.close();            
                  db.close();
            }finally
            {
                dataManager.close();
            }
        }
        public void onClickTabelleAnzeigen(View view)
        {
            txtview = (TextView) view;
            //Neue Activity
            final Intent intent = new Intent(this, ListenAnsicht.class);
            //zu übergebene Werte setzen
            listenid = (long) txtview.getId();
            try {
                SQLiteDatabase db = dataManager.getReadableDatabase();
                  Cursor cursor = db.rawQuery("SELECT DISTINCT listentyp FROM "+ LISTEN_TABLE_NAME + " WHERE _ID = '" + listenid +"'", null);
                  startManagingCursor(cursor);
                      if(cursor.moveToFirst())
                        {
                            listentyp = cursor.getString(0);
                        }
                  db.close();
                } finally {
                    dataManager.close();
                }
            //Extras übergeben
            intent.putExtra(LISTENID, listenid);
            intent.putExtra(LISTENTYPEXTRA, listentyp);
            finish();
            startActivity(intent);
        }
        public void onClickTabelleHinzufuegen(View view)
        {
            newTable = null;
            newTable = (EditText) findViewById(R.id.edt_liste_name);
            RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radiogroup_tabellentyp);
            int checkedRadioButton = radioGroup.getCheckedRadioButtonId();
            //Fehlende Eingaben prüfen
            if(newTable.getText().toString().equals(""))//Listenname
            {
                Toast msg = Toast.makeText(ListenUebersicht.this, "Sie haben keinen Listennamen eingegeben", Toast.LENGTH_LONG);
    
                msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
    
                msg.show();
            }else if(checkedRadioButton == -1)//Listentyp
            {
                Toast msg = Toast.makeText(ListenUebersicht.this, "Sie haben keinen Listentyp gewählt", Toast.LENGTH_LONG);
    
                msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
    
                msg.show();
            }else//wenn alle Eingaben vorhanden
            {
                final Intent intent = new Intent(this, EintragHinzufuegen.class);
                listenname = newTable.getText().toString();
                listentyp = "bla";
                
                switch (checkedRadioButton) 
                {
                case R.id.radioButtonTaschengeld : listentyp = "taschengeld";
                     break;
                case R.id.radioButtonWirtschaft : listentyp = "wirtschaftsgeld";
                     break;
                }
                neueListe = true;
                intent.putExtra(LISTENNAME, listenname);
                intent.putExtra(LISTENTYPEXTRA, listentyp);
                intent.putExtra(NEUELISTE, neueListe);
                finish();
                startActivity(intent);
            }
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            getMenuInflater().inflate(R.menu.optionsmenu_listenuebersicht, menu);
            return super.onCreateOptionsMenu(menu);
        }
        public boolean onOptionsItemSelected(MenuItem item)
        {//Was passiert wenn ein Options-Menü Eintrag gewählt wird
            switch(item.getItemId())
            {
                case R.id.opt_beenden_listenuebersicht: 
                    System.exit(0);
                default:
                    return super.onOptionsItemSelected(item);
            }
        }
    }
    mein ListenAdapter(ListeListAdapter)

    Code:
    package de.micka.lebenshilfe;
    
    import java.util.ArrayList;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    
    public class ListeListAdapter extends BaseAdapter
    {
        private ArrayList<Liste> mData = new ArrayList<Liste>();
        private final LayoutInflater mLayoutInflater;
        public ListeListAdapter(Context pContext, ArrayList<Liste> pData)
        {
                        mData = pData;
                        
                        mLayoutInflater = (LayoutInflater) pContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        //Gibt uns die Anzahl der Elemente in der ArrayList zurück
        public int getCount() 
        {
            return mData.size();
        }
        //Gibt uns das Item an der gewünschten Stelle zurück
        public Object getItem(int pPosition) 
        {
            return mData.get(pPosition);
        }
        //getItemId() gibt normalerweise die Reihen ID zurück, welche mit dem Element an der Position in der ArrayList in Verbindung gebracht wird. Für unseren Zweck aber uninteressant.
        public long getItemId(int pPosition) 
        {
            Liste tab = mData.get(pPosition);
            return tab.id;
        }
        public void changeData(ArrayList<Liste> pData)
        {
            mData = pData;
            this.notifyDataSetChanged();
        }
        //
        public View getView(int pPosition, View convertView, ViewGroup parent) 
        {
            if (convertView == null) 
            {
                convertView = mLayoutInflater.inflate(R.layout.tabellenanzeigenlayout, null);
            }
            [B]((TextView) convertView.findViewById(R.id.btn_tabelle)).setText(((Liste)getItem(pPosition)).listenname);[/B] //Zeile 50
            ((TextView) convertView.findViewById(R.id.btn_tabelle)).setId(((Liste)getItem(pPosition)).id);
            
            return convertView;
        }
        
    }
    
    Zum Schluss noch der LogCat:
    Im Anhang ist das Projekt nochmal gezipped.
     

    Anhänge:

  8. Tom299, 18.06.2012 #8
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    R.id.btn_tabelle ist das wirklich ein TextView? Ich hätte da jetzt einen Button vermutet, zumindest klingt es danach ;-)
     
  9. Micka, 18.06.2012 #9
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Vom Namen her ist es falsch, aber es ist ein TextView :)
     
  10. Tom299, 18.06.2012 #10
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    dann mach aus dem komplexen konstrukt ein paar zwischenschritte und debug mal durch, um zu sehen, was null ist
     
  11. swordi, 18.06.2012 #11
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    unabhängig vom problem
    ((TextView) convertView.findViewById(R.id.btn_tabelle)).setText(((Liste)getItem(pPosition)).listenname); //Zeile 50
    ((TextView) convertView.findViewById(R.id.btn_tabelle)).setId(((Liste)getItem(pPosition)).id);

    du machst hier 2 mal findviewbyid auf das gleiche element - und das im getview des adapters.
    denke mal das ist performancemäßig so ziemlich das langsamste was man machen kann.

    nur zur info
     
    Micka bedankt sich.
  12. Micka, 18.06.2012 #12
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Meiner Meinung nach dürfte der ListAdapter garnicht mehr in Benutzung sein. Der ListAdapter wird nur verwendet damit die Listview die angelegten Listen anzeigt, denke da ist irgendwo anders der Wurm drin, am debuggen bin ich schon seit heute früh
     

    Anhänge:

    Zuletzt bearbeitet: 18.06.2012
  13. swordi, 18.06.2012 #13
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    warum sollte er nicht in benützung sein ?

    die liste wird doch angezeigt. die getview methode wird öfter aufgerufen, als du wahrscheinlich vermutest.
     
    Micka bedankt sich.
  14. Micka, 18.06.2012 #14
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Ich stelle mir das so vor, wenn die Activity aufgerufen wird rattert der einmal dadurch uns setzt die ganzen existierenden Listen in die Listview. Danach ist der fertig.

    Wenn ich nun in das Textfeld oben etwas eingebe, wieso wird dann der ListAdapter benutzt? der hat doch nur was mir der Listview zu tun.
     
  15. swordi, 18.06.2012 #15
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ok dann hast du aber falsche vorstellungen :D

    eine listview mit einem adapter ist ein sehr komplexes und mächtiges konstrukt. da steckt wesentlich mehr dahinter. das was du beschreibst würde ja keinen adapter benötigen, dann kann ich einzelne reihen ja einfach so einfügen. adapter wäre dazu keiner nötig.

    ein guter tipp: schau dir unbedingt das konzept dahinter genau an. es ist sehr wichtig und du wirst es immer wieder brauchen.
     
    Micka bedankt sich.
  16. Micka, 18.06.2012 #16
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Hab die App nun auf dem Gerät neu installiert, die App gestartet, die erste Liste angelegt. Bis dahin alles super

    dann habe ich eine 2 Liste angelegt, klappt auch. Nach dem Anlegen wird immer die Detailansicht einer Liste geöffnet. Klappt auch.

    Dann Will ich zurück zur Listenübersicht->
    dann kann ich wählen zwischen warten oder Schließen erzwingen
    wähle ich warten kommt im Logcat irgendwann
    Irgendwann wird die App dann geschlossen. Wenn ich sie erneut öffne das gleiche wie zum Schluß, bis die App beendet wird

    Keine Exception nichts...
    evtl ist es verständlicher wenn ich ein Video vom Emulator hier verlinke
    Was haltet ihr davon?

    Der ursprüngliche Beitrag von 12:02 Uhr wurde um 12:05 Uhr ergänzt:

    Wo guck ich mir das am besten an? Wo wirds gut erklärt?

    Hab mal ein Video gemacht, zu finden unter
    und hier noch der LogCat Output nach dem Absturz:


    Der ursprüngliche Beitrag von 12:05 Uhr wurde um 13:05 Uhr ergänzt:

    Habe die Methode getView in meinem ListAdapter nun verändert bezüglich Performance, danke an Swordi für den Hinweis.

    die MEthode sieht jetzt wie folgt aus
    Code:
    {
            if (convertView == null) 
            {
                convertView = mLayoutInflater.inflate(R.layout.listenanzeigenlayout, null);
            }
            TextView anzeige = (TextView) convertView.findViewById(R.id.btn_tabelle);
            anzeige.setText(mData.get(pPosition).listenname); [B]//Zeile 53[/B]
            anzeige.setId(mData.get(pPosition).id);
                
            return convertView;
        }
    Nun ist die NullPointer Exception laut LogCat in Zeile 53


    Der ursprüngliche Beitrag von 13:05 Uhr wurde um 13:25 Uhr ergänzt:

    Ich werde das Gefühl nicht los das es an der Datenbank liegt. Die App lief ja einwandfrei bevor ich die Verwaltung der Datenbank eingefügt habe. Der List Adapter hat dort auch keine Probleme gemacht
     
    Zuletzt bearbeitet: 18.06.2012
  17. Tom299, 18.06.2012 #17
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich weiß nicht, aber ich glaub du hast da etwas zu kompliziert gemacht. Wozu brauchst du dieses mData?

    In einem Adapter hat man doch immer die gleiche Logik, z.B.:
    Code:
    public class LoginArrayAdapter extends ArrayAdapter<User> {
    
    	private int resourceID;	
    	
    	public LoginArrayAdapter(Context context, int resourceId, List<User> userList) {
    		super(context, resourceId, userList);
    		this.resourceID = resourceId;
    	}
    	
    	public LoginArrayAdapter(Context context, int resourceId, int textViewResourceId, List<User> userList) {
    		super(context, resourceId, textViewResourceId, userList);
    		this.resourceID = resourceId;
    		//this.tvResourceID = textViewResourceId;
    	}
    	
    	/* (non-Javadoc)
    	 * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
    	 */
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		User user = getItem(position);
    		LinearLayout layout = null;
    		
    		if (convertView == null) {
    			layout = new LinearLayout(getContext());
    			LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    			inflater.inflate(resourceID, layout, true);
    		}
    		else {
    			layout = (LinearLayout)convertView;
    		}
    
    		TextView tvUsername = (TextView)layout.findViewById(R.id.login_spUser_tvUsername);
    		tvUsername.setText(user.getLogin());
    		
    		return layout;
    	}
    }
    
    In meinem Fall übergeb ich List<User> userList, du übergibst glaub ich eine Liste mit Tabellen-Objekten.

    In getView(...) kann man sich das entsprechende Objekt ja dann gleich rausnehmen, bei mir z.B.:
    Code:
    User user = getItem(position);
    
    Danach kannst du ja auf alle public-eigenschaften zugreifen. Bei dir wärs dann sowas wie:
    Code:
    Tabelle tabelle = getItem(position);
    .
    .
    .
    anzeige.setText(tabelle.listenname) bzw. anzeige.setText(tabelle.getListenname())
    anzeige.setId(tabelle.id) bzw. anzeige.setId(tabelle.getId())
    
     
    Micka bedankt sich.
  18. Micka, 18.06.2012 #18
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Gehen wir mal davon aus es liegt nicht am Adapter, woran könnte es noch liegen?

    Ich fasse den aktuellen Stand nochmal kurz zusammen.

    Meine App startet, ich kann eine liste hinzufügen und dieser Liste beliebig viele Einträge hinzufügen(Der ListAdapter für die Einträge ist nach dem gleichen Schema aufgebaut wie der ListAdapter für die Listen). Das klappt auch bei beliebig vielen Einträgen.

    Erstelle ich eine zweite Liste kann ich dieser wieder beliebig viele Einträge hinzufügen, klappt auch.

    Will ich die Listenübersicht aufrufen, wenn mehr als eine Liste existiert, schmiert die App ohne Hinweisende Exceptions ab.

    Kann es sein das zuviel CPu verbraucht wird? Das Testgerät ist ein altes Android 2.1 Device bzw. ein Android 2.1 Emulator



    Der ursprüngliche Beitrag von 15:27 Uhr wurde um 15:45 Uhr ergänzt:

    besser gesagt warum verbraucht die App soviel CPU, meiner Meinung nach sind die 83% für eine solch simple App viel zu viel
     
  19. swordi, 18.06.2012 #19
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hmm warum sollte 83% cpu viel sein ?

    wenn die app im vordergrund ist, möchte man ja, dass sie gut läuft, und warum soll die cpu sich groß mit anderem beschäftigen?

    macht ja keinen sinn, wenn die app (egal wie groß oder klein) nur 30% cpu hat, wenn aber mehr verfügbar wäre.


    "Schmiert die App ohne hinweisende Exception ab" gibts wohl nicht... irgendwo gibts immer hinweise
     
  20. Micka, 18.06.2012 #20
    Micka

    Micka Threadstarter Erfahrener Benutzer

    Beiträge:
    173
    Erhaltene Danke:
    1
    Registriert seit:
    30.12.2011
    Ich mach nochmal ein Video, diesmal so das man den Logcat schön lesen kann. Im LogCat werden keine Exceptions genannt oder so

    Der ursprüngliche Beitrag von 16:01 Uhr wurde um 16:55 Uhr ergänzt:

    Hier der Link zum Video:
    Zwischen Minute 1:33 und 2:33 blieb der Bildschirm des Emulators einfach schwarz, dann wurde die App plötzlich beendet.


    Hier die LogCat Ausgabe:
     

    Anhänge:

Diese Seite empfehlen