sql >> Database >  >> RDS >> SQLite

Hoe SQLite-query asynchroon uit te voeren op achtergrondthread?

Waarschijnlijk is deze https://developer.android.com/reference/android/app/LoaderManager.html de suite voor jou.

Trouwens, hier is een korte implementatie voor jou, maar dit is niet RxJava.

Ten eerste moet u LoaderManager.LoaderCallbacks<Cursor> implementeren , en meestal wordt deze interface geïmplementeerd door Activiteit (of Fragment).

In onCreateLoader , een CursorLoader moet worden gemaakt en geretourneerd. Hier is slechts een voorbeeld met MyCursorLoader als afstammeling van CursorLoader , waar u verbinding kunt maken met de database en query's.

In onLoadFinished je moet de cursor behandelen met de resultaten van de zoekopdracht.

Overweeg alstublieft de link naar android.com, hierboven vermeld.

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
    super.onResume();

    // start loading data using LoaderManager of Activity
    // third argument only has sense in this case
    getLoaderManager().initLoader(0, null, this);
}

private static final String ACTIVITY_NAME = "main_activity";

private void treatCursorRow(Cursor cursor){
    // treat record from cursor
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // this callback is called by LoaderManager in order to obtain CursorLoader
    // here a new one loader is created
    // created loader will be processed by LoaderManager
    return new MyCursorLoader(this, ACTIVITY_NAME);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // this callback is called when loader finishes load cursor
    // you don't need to destroy loader - just tread the data
    if(data != null)
        while(data.moveToNext())
            treatCursorRow(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // here you can do something
    // relevant to cancelling of loading data
    // in example, when you have an event that cancels current
    // loading and restarts new one
}

class MyCursorLoader extends CursorLoader {

    private static final String DATABASE_NAME = "my_database";
    private static final int DATABASE_VERSION = 1;
    private String name_param;

    public MyCursorLoader(Context context, String activity_name) {
        super(context);
        name_param = activity_name;
    }

    @Override
    public Cursor loadInBackground() {
        // assuming, that we have implemented SQLiteOpenHelper
        // to treat sqlite-database
        MyDatabaseHelper dbh = new MyDatabaseHelper(
                MainActivity.this,
                DATABASE_NAME,
                null,
                DATABASE_VERSION
        );
        return dbh.getWritableDatabase().rawQuery(
                "SELECT * FROM some_table WHERE name=?",
                new String[]{ name_param }
        );
    }

}

}

Een andere manier is het gebruik van ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html .

Op deze manier kunt u datalaag en bedrijfslogica scheiden. Uw gegevenstoegang wordt geabstraheerd naar uris.Gebruik ContentProvider , definieert u uw zoekopdrachten erin en laadt u gegevens met Uri:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return getContentResolver().query(
            YourContentProvider.SOME_URI,
            null,
            null,
            null,
            null
    );
}

Dit is een handige manier als u meer dan een of twee klanten van uw gegevens heeft (Activiteiten of Fragmenten) - u gebruikt alleen vooraf gedefinieerde uris in plaats van het herhalen van SQL-query's of het maken van veel CursorLoaders descendands .

Bovendien, ContentProvider kan desgewenst van buiten uw app worden gebruikt.




  1. Wordt BEHALVE sneller uitgevoerd dan een JOIN wanneer de tabelkolommen hetzelfde zijn?

  2. Hoe een absolute waarde in SQL te berekenen?

  3. MySQL - Waarde aftrekken van de vorige rij, groeperen op

  4. Belangrijkste veelvoorkomende problemen met MHA en hoe u ze kunt oplossen