sql >> Databáze >  >> RDS >> SQLite

Jak spustit dotaz SQLite asynchronně na vláknu na pozadí?

Pravděpodobně pro vás bude tato https://developer.android.com/reference/android/app/LoaderManager.html sada.

Kromě toho je zde pro vás krátká implementace, ale toto není RxJava.

Nejprve musíte implementovat LoaderManager.LoaderCallbacks<Cursor> a obvykle toto rozhraní implementuje Aktivita (nebo Fragment).

V onCreateLoader , CursorLoader by měl být vytvořen a vrácen. Zde je pouze příklad s MyCursorLoader jako potomkem CursorLoader , kde můžete provádět připojení k databázi a dotazy.

V onLoadFinished musíte kurzor zacházet s výsledky dotazu.

Vezměte prosím v úvahu výše uvedený odkaz na android.com.

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 }
        );
    }

}

}

Dalším způsobem je použití ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html .

Tímto způsobem můžete oddělit datovou vrstvu a obchodní logiku. Váš přístup k datům bude odebrán společnosti uris.Using ContentProvider , definujete v něm své dotazy a načítáte data pomocí Uri:

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

To je pohodlný způsob, pokud máte více než jednoho nebo dva zákazníky svých dat (Aktivity nebo Fragmenty) - budete používat pouze předdefinované uris spíše opakování SQL dotazů nebo vytváření mnoha CursorLoaders descendands .

Navíc ContentProvider můžete použít mimo vaši aplikaci, pokud chcete.




  1. Jak nainstalovat sqlcmd &bcp na SUSE

  2. Cloud Vendor Deep-Dive:PostgreSQL na Google Cloud Platform (GCP)

  3. Je možné mít indexovaný pohled v MySQL?

  4. Spravujte MySQL pomocí phpMyAdmin na Debianu 5 (Lenny)