(SQL) Daten werden in ListActivity nicht angezeigt.

E

El_Rakiti

Ambitioniertes Mitglied
5
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 :)
 
hey,
der link funktioniert nicht.
 
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 =)
 
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;
    }
    


}
 
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...
 

Ähnliche Themen

M
  • mafoma63
Antworten
2
Aufrufe
762
swa00
swa00
B
Antworten
3
Aufrufe
1.308
swa00
swa00
A
Antworten
10
Aufrufe
1.021
swa00
swa00
Zurück
Oben Unten