Wahrscheinlich ist dieser https://developer.android.com/reference/android/app/LoaderManager.html für Sie geeignet.
Außerdem ist hier eine kurze Implementierung für Sie, aber das ist nicht RxJava.
Zuerst müssen Sie LoaderManager.LoaderCallbacks<Cursor>
implementieren , und normalerweise wird diese Schnittstelle von Activity (oder Fragment) implementiert.
In onCreateLoader
, ein CursorLoader
erstellt und zurückgegeben werden sollen. Hier ist nur ein Beispiel mit MyCursorLoader als Nachkomme von CursorLoader
, wo Sie eine Verbindung zur Datenbank und Abfragen herstellen können.
In onLoadFinished
Sie müssen den Cursor mit den Ergebnissen der Abfrage behandeln.
Bitte beachten Sie den oben erwähnten Link zu 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 }
);
}
}
}
Eine andere Möglichkeit ist die Verwendung von ContentProvider
https://developer.android.com/guide/topics/providers/content-providers.html .
Auf diese Weise können Sie Datenschicht und Geschäftslogik trennen. Ihr Datenzugriff wird auf uris.Using ContentProvider
abstrahiert , Sie definieren Ihre Abfragen darin und laden Daten mit Uri:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return getContentResolver().query(
YourContentProvider.SOME_URI,
null,
null,
null,
null
);
}
Dies ist praktisch, wenn Sie mehr als einen oder zwei Kunden Ihrer Daten (Aktivitäten oder Fragmente) haben - Sie verwenden nur vordefinierte URIS, anstatt SQL-Abfragen zu wiederholen oder viele descendands
von CursorLoaders zu erstellen .
Außerdem ContentProvider
kann von außerhalb Ihrer App verwendet werden, wenn Sie möchten.