SQLite asynchron benutzen

znieh99

znieh99

Fortgeschrittenes Mitglied
12
Hallo Forum,
ich versuche den asynchronen Zugriff auf eine SQLite-DB. Dabei habe ich mindestens 2 Probleme erkannt:

1) Ich kann die DB auslesen, aber sie kommt nicht über onLoadFinished(Loader<Cursor> loader, Cursor Cursor) zurück. Daher vermute ich, dass der Zugriff gar nicht asynchron erfolgt.

2) Nach Beenden der Methode workWithDB verabschiedet sich die App mit:
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.app.heinz.testdatabase, PID: 2844
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
Hier die MainActivity:
Code:
public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>{

    private static final int LOADER_ID = 1;
    private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;
    private SimpleCursorAdapter mAdapter;

    private  UniverseDB mDB;
    private SQLiteDatabase dbConn;

    private static final Uri DB_URI = Uri.parse("content://data/data/" +
            "com.app.heinz.testdatabase/databases/universe.db");
    private static  final String[] DB_SUCHSPALTEN = new String[] {
            StepColumns.STEP_NR,
            StepColumns.DESCRIPTION,
            StepColumns.TIMESTAMP
    };

    @Override  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String[] dataColumns = { "text_column" };
        int[] viewIDs = { R.id.list };          //ListView Id

        mAdapter = new SimpleCursorAdapter(this, R.id.list,
                null, StepQuery.ALL_COLUMNS, viewIDs, 0);

         setListAdapter(mAdapter);

        mCallbacks = this;

        LoaderManager lm = getLoaderManager();
        lm.initLoader(LOADER_ID, null, mCallbacks);

        mDB = UniverseDB.getInstance(this);
        dbConn = mDB.getWritableDatabase();

        workWithDB();
    }           //end onCreate ----------------------------------------

    @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) {
               return new android.content.CursorLoader(MainActivity.this);
    }

    @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
               switch (loader.getId()) {
            case LOADER_ID:
                   // The asynchronous load is complete and the data
                   // is now available for use. Only now can we associate
                   // the queried Cursor with the SimpleCursorAdapter.
                mAdapter.swapCursor(cursor);
                break;
        }
     }

    @Override public void onLoaderReset(Loader<Cursor> loader) {
        // For whatever reason, the Loader's data is now unavailable.
        // Remove any references to the old data by replacing it with
        // a null Cursor.
        mAdapter.swapCursor(null);
    }


    private void workWithDB() {
        int index[] = {1, 101, 102, 301};
        int end = index.length;
        for(int i = 0; i < end; i++) {
            ContentValues values = new ContentValues();
            values.put(StepColumns.STEP_NR, index[i]);
            values.put(StepColumns.DESCRIPTION, "Step: " + index[i]);
        }           //end for i ------------------------------------------

        Cursor stepCursor = mDB.getWritableDatabase().
                query(StepQuery.TABLE_NAME,
                    DB_SUCHSPALTEN, null, null,
                    null, null, null);

        while(stepCursor.moveToNext()) {
            int i = stepCursor.getInt(0);
            String s = stepCursor.getString(1);
            int t = stepCursor.getInt(2);
            int a = 1;
        }
    }           //end workWithDB --------------------------------------
}           //end C MainActivity --------------------------------------
 
Hallo Heinz ,
Du verwendest die DB leider ein wenig "falsch". ich bin auch ein wenig überrascht, woher du den Code da hast :)

Nun , ich vermisse in deinem Code erst mal den SqLiteOpenHelper.
Und beim Auslesen benötigst du auch keinen Listener

Hier mal ein schönes Beispiel :
Android SQLite database and content provider - Tutorial


Die "while" Schleife finde ich auch ein wenig tödlich - Mach lieber so was in der Richtung

Code:
   Cursor m1Cursor = database.rawQuery(query,null);
        int count = 0;
        if (m1Cursor != null)
        {
            if(m1Cursor.moveToFirst())
            {
                for(int i=0;i<m1Cursor.getCount();i++)
                {
                    int pages = m1Cursor.getInt(m1Cursor.getColumnIndex("MYFIELD"));
                    m1Cursor.moveToNext();
                }
            }
            m1Cursor.close();
        }


P.S Ich würde das Ganze auch in eine eigene Klasse auslagern - so wie du das hast ist es sehr unübersichtlich und hat
eigentlich nichts in de Activity zu suchen.
Ich würde zumindest dabei in ein paar Wochen den Überblick verloren haben :)

Du "vermengst" ziemlich viel - ein bisschen mehr OOP wäre Dir liebevoll angeraten :)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Vacutainer

Ähnliche Themen

R
Antworten
6
Aufrufe
1.014
swa00
swa00
M
Antworten
5
Aufrufe
1.077
markusk73
M
Zurück
Oben Unten