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

(SQL) Daten werden in ListActivity nicht angezeigt.

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von El_Rakiti, 14.02.2011.

  1. El_Rakiti, 14.02.2011 #1
    El_Rakiti

    El_Rakiti Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    60
    Erhaltene Danke:
    5
    Registriert seit:
    14.02.2011
    Hallo Leute,

    ich versuche mich aktuell an der Android Entwicklung, zum Einstieg fange ich mit einem einfachen Notiz Programm an. Man kann eine Notiz (mit Titel und Text) erstellen und diese soll in einer ListActivity angezeigt werden.

    Ich bin auch eigentlich gut voran gekommen, allerdings habe ich nun eine Änderung gemacht und jetzt geht nix mehr :D. Vorher funktionierte es so:

    ListActivity (start activitiy) ruft "Text"Activity auf. Hier kann in 2 TextEdits Titel und Text eingegeben werden, diese wurden dann mittels putExtra("Titel",Titel) und putExtra("Text",Text") übergeben.

    Das funktionierte auch. Allerdings macht es (imo) mehr Sinn, direkt meine Objekte weiterzuleiten (habe eine Note Klasse), da dies in gewissen Situationen viel einfacher zu handeln geht.

    Habe also das Interface Serializable implementiert und mit einem Bundle das Objekt weitergereicht. Aber irgendwie bekomme ich jetzt keine Notizen in der ListActivity angzeigt.

    Ich weiß aktuell einfach nicht, wo der Fehler liegen kann und bevor ich nun wieder Stunden mit sinnlosem suchen vergeude, wende ich mich hilfsbedürftig an euch ;-).

    Hier die relevanten Codestellen:


    Erstellt in onStart() (damit beim Hinzufügen neuer Notizen diese auch sofort angezeigt werden)
    Code:
    private void createListView()
        
        {
            
            mCursor = dbHelper.getAllNotesCursor();
            
            startManagingCursor(mCursor);
            // Now create a new list adapter bound to the cursor.
            // SimpleListAdapter is designed for binding to a Cursor.
            ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
                    android.R.layout.simple_list_item_1, // Specify the row template
                                                            // to use (here, two
                                                            // columns bound to the
                                                            // two retrieved cursor
                                                            // rows).
                    mCursor, // Pass in the cursor to bind to.
                    // Array of cursor columns to bind to.
                    new String[] { dbHelper.colTitle },
                    // Parallel array of which template objects to bind to those
                    // columns.
                    new int[] { android.R.id.text1 });
    
            // Bind to our new adapter.
            setListAdapter(adapter);
            return;
        }
    
    Hmm, am besten ihr schaut es euch im Projekt an, ich weiß nämlich nicht, welchen Code ich sonst noch zeigen soll...Wichtig ist ja irgendwie alles ;-).

    Und hier das gesamte Projekt zum Download!

    Auf jeden Fall vielen, vielen Dank =)


    PS: Ich glaube, bzw. bin mir fast sicher, dass es einige Stellen gibt, die man schöner programmieren kann. Sobald im Projekt der Status "Beta" erreicht ist (also die Hauptfunktionen fertig sind) werde ich das ganze mal (mit dem dann bestehenden "Wissenstand) überarbeiten und eure Meinung bzw. "Architektur" / Aufbau einholen :)
     
  2. Sabian, 15.02.2011 #2
    Sabian

    Sabian Junior Mitglied

    Beiträge:
    27
    Erhaltene Danke:
    2
    Registriert seit:
    21.12.2010
    hey,
    der link funktioniert nicht.
     
  3. El_Rakiti, 15.02.2011 #3
    El_Rakiti

    El_Rakiti Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    60
    Erhaltene Danke:
    5
    Registriert seit:
    14.02.2011
    Hmm, komisch. Muss ich mir mal anschauen.

    Hat sich aber eh erledigt ;-). Auf einmal klappt es, war wahrscheinlich ein Fehler im Layout (beim SimpleCursorAdapter).

    Trotzdem danke =)
     
  4. El_Rakiti, 15.02.2011 #4
    El_Rakiti

    El_Rakiti Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    60
    Erhaltene Danke:
    5
    Registriert seit:
    14.02.2011
    Jetzt klappts plötzlich wieder nicht mehr....Irgendwo steckt in der Anzeige oder der Art der Anzeige ein Fehler...

    Ich komme nicht weiter. Im Cursor sind die Daten enthalten, zumindest liefer getCount() Ergebnisse.

    Hier mal der SourceText meiner ganzen ListActivity, ich habe schon soviel umgesetzt und umgeschrieben, aber es will einfach nicht klappen. Vielleicht findet von euch jemand den Fehler...

    Hier das ganze Projekt zum Download:

    Code:
    package android.mirco.notes;
    
    import android.app.ListActivity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.mirco.notes.R;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.widget.AdapterView;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.Toast;
    
    
    public class MainList extends ListActivity {
        
        private static final int ADD_NOTE = 1;
        private static final int EDIT_NOTE = 2;
        private DBOpenHelper dbHelper;
        private Cursor mCursor;
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            registerForContextMenu(getListView());
            dbHelper = new DBOpenHelper(getApplicationContext());
        }
        
        @Override
        protected void onStart() {
            // TODO Auto-generated method stub
            super.onResume();
            createListView();
            
        }
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            // TODO Auto-generated method stub
            super.onListItemClick(l, v, position, id);
            
            /*Cursor cursor = dbHelper.getNoteCursorById(id);
            
            if (cursor.isAfterLast() || cursor.isBeforeFirst())
            {
                Toast.makeText(getApplicationContext(), "Konnte Note mit ID: " + id + " nicht finden!", Toast.LENGTH_LONG).show();
                return;
            }
            
            Intent textEditorAtivity = new Intent(getApplicationContext(),TextEditor.class);
            
            Bundle bundle = new Bundle();
            
            Toast.makeText(getApplicationContext(), cursor.getString(cursor.getColumnIndex(dbHelper.colTitle)), Toast.LENGTH_LONG);
            
            bundle.putString("Title", cursor.getString(cursor.getColumnIndex(dbHelper.colTitle)));
            bundle.putString("Text", cursor.getString(cursor.getColumnIndex(dbHelper.colText)));
            textEditorAtivity.putExtras(bundle);
            
            startActivity(textEditorAtivity);*/
            
            
            // Vorher wurde ein Cursor ermittelt und die Werte der Note daraus ausgelesen.
            // Da bei einem Klick auf eine Note aber auch nur eine Note ausgewählt wird,
            // wird jetzt direkt ein Objekt zurückgegeben, dass weiter geleitet werden kann
            
            Note note = dbHelper.getNoteById(id);
            
            Intent textEditorAtivity = new Intent(getApplicationContext(),TextEditor.class);
            
            Bundle bundle = new Bundle();
            bundle.putSerializable("note", note);
            
            textEditorAtivity.putExtras(bundle);
            
            startActivityForResult(textEditorAtivity, EDIT_NOTE);
    
        }
        
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            
            switch (item.getItemId()) {
            case R.id.mnuAdd:
                Intent textEdit = new Intent(getApplicationContext(),TextEditor.class);
                startActivityForResult(textEdit, ADD_NOTE);
                break;
    
            default:
                break;
            }
            return true;
        }
        
        
        // Nach beenden der TextEditor Activity (wo der Titel und der Text einer Note geändert werden kann)
        // wird der Datensatz hier nun weggeschrieben/ aktualisiert
        
        // ??????????????????????????????????????????????????????????????
        // Oder hätte das in der Texteditor Activity geschehen sollen????
        // ??????????????????????????????????????????????????????????????
        
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            
            
            switch (requestCode) {
            case ADD_NOTE:
                if (resultCode == RESULT_OK)
                {
                    Note note = (Note)data.getSerializableExtra("note");
                    Toast.makeText(getApplicationContext(), "Titel: " + note.getTitle(), Toast.LENGTH_SHORT);
    
                    dbHelper.AddNote((Note)data.getSerializableExtra("note"));
                    createListView();
                }
                
                break;
                
            case EDIT_NOTE:
                if (resultCode == RESULT_OK)
                {
                    dbHelper.EditNote((Note)data.getSerializableExtra("note"));
                }
                break;
    
            default:
                break;
            }
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.listmenu, menu);
            return true;
            
        }
        
        
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                ContextMenuInfo menuInfo) {
            // TODO Auto-generated method stub
            super.onCreateContextMenu(menu, v, menuInfo);
            
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.listcontextmenu, menu);
            return;
        }
        
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            // TODO Auto-generated method stub
            AdapterView.AdapterContextMenuInfo info = 
                (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
    
            
            switch (item.getItemId()) {
            case R.id.mnuDeleteListItem:
                dbHelper.DeleteNote(info.id);
                createListView();
                Toast.makeText(getApplicationContext(),"Eintrag mit ID: " + info.id + " wurde gelöscht!",Toast.LENGTH_SHORT).show();
                break;
                
            case R.id.mnuAddListItem:
                Intent textEdit = new Intent(getApplicationContext(),TextEditor.class);
                startActivityForResult(textEdit, ADD_NOTE);
                break;
    
            default:
                break;
            }
            return super.onContextItemSelected(item);
        }
        
        private void createListView()
        
        {
            
            
            mCursor = dbHelper.getAllNotesCursor();
            
            startManagingCursor(mCursor);
            // Now create a new list adapter bound to the cursor.
            // SimpleListAdapter is designed for binding to a Cursor.
            ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
                    android.R.layout.two_line_list_item, // Specify the row template
                                                            // to use (here, two
                                                            // columns bound to the
                                                            // two retrieved cursor
                                                            // rows).
                    mCursor, // Pass in the cursor to bind to.
                    // Array of cursor columns to bind to.
                    new String[] { dbHelper.colTitle,dbHelper.colText },
                    // Parallel array of which template objects to bind to those
                    // columns.
                    new int[] { android.R.id.text1,android.R.id.text2 });
    
            // Bind to our new adapter.
            setListAdapter(adapter);
            return;
        }
        
    
    
    }
    
    
    
     
  5. El_Rakiti, 16.02.2011 #5
    El_Rakiti

    El_Rakiti Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    60
    Erhaltene Danke:
    5
    Registriert seit:
    14.02.2011
    So, ich möchte lösen :D. Der Fehler lag -natürlich- bei mir.

    In
    Code:
     Cursor getAllNotesCursor()
         {
             SQLiteDatabase db=this.getReadableDatabase();
             Cursor cur = db.rawQuery("SELECT * FROM " + tblNotes,new String[] {});
             int columns = cur.getColumnCount();
            // db.close();
             
             return cur;
         }
    
    habe ich die Datenbank wieder geschlossen. Ich hatte in dem Tutorial gelesen, dass man die Datenbank am Besten sofort wieder schließen soll...Allerdings gings da um SQL-Commands...Hätte mir auch denken können, dass das Schließen der DB Auswirkungen auf den Cursor hat...
     

Diese Seite empfehlen