SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Jak uruchomić zapytanie SQLite asynchronicznie w wątku w tle?

Prawdopodobnie ten https://developer.android.com/reference/android/app/LoaderManager.html będzie dla Ciebie odpowiedni.

Poza tym, oto krótka implementacja, ale to nie jest RxJava.

Po pierwsze, musisz zaimplementować LoaderManager.LoaderCallbacks<Cursor> , i zazwyczaj ten interfejs jest implementowany przez Activity (lub Fragment).

W onCreateLoader , CursorLoader należy utworzyć i zwrócić. Oto tylko przykład z MyCursorLoader jako potomkiem CursorLoader , gdzie możesz wykonać połączenie z bazą danych i zapytaniami.

W onLoadFinished musisz potraktować kursor z wynikami zapytania.

Proszę wziąć pod uwagę link do android.com, wspomniany powyżej.

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

}

}

Innym sposobem jest użycie ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html .

W ten sposób możesz oddzielić warstwę danych i logikę biznesową. Twój dostęp do danych zostanie oddzielony do uris.Korzystanie z ContentProvider , definiujesz w nim swoje zapytania i ładujesz dane za pomocą Uri:

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

Jest to wygodny sposób, jeśli masz więcej niż jednego lub dwóch klientów swoich danych (działania lub fragmenty) - użyjesz tylko predefiniowanych uris, zamiast powtarzać zapytania sql lub tworzyć wiele CursorLoaderów descendands .

Ponadto ContentProvider może być używany spoza Twojej aplikacji, jeśli chcesz.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolumna _ID nie istnieje błąd, chociaż istnieje w tabeli

  2. Aktualizacja SQLite

  3. Jak zaimplementować bazę danych SQLite do przechowywania obrazu bitmapowego i tekstu?

  4. Jaki jest limit zmiennych SQL, które można określić w pojedynczym zapytaniu execSQL?

  5. Nie mogę ustawić wielu obrazów w widoku siatki?