संभवतः यह https://developer.android.com/reference/android/app/LoaderManager.htmlआपके लिए उपयुक्त होगा।
इसके अलावा, यहां आपके लिए संक्षिप्त कार्यान्वयन है, लेकिन यह RxJava नहीं है।
सबसे पहले, आपको LoaderManager.LoaderCallbacks<Cursor>
को लागू करने की आवश्यकता है , और आमतौर पर यह इंटरफ़ेस गतिविधि (या टुकड़ा) द्वारा कार्यान्वित किया जाता है।
onCreateLoader
. में , एक CursorLoader
बनाया और लौटाया जाना चाहिए। यहाँ MyCursorLoader के साथ CursorLoader
के वंशज के रूप में एक उदाहरण दिया गया है , जहां आप डेटाबेस और क्वेरी से कनेक्शन कर सकते हैं।
onLoadFinished
. में आपको क्वेरी के परिणामों के साथ कर्सर का इलाज करना होगा।
कृपया, ऊपर बताए गए 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 }
);
}
}
}
दूसरा तरीका है, ContentProvider
. का उपयोग करना https://developer.android.com/guide/topics/providers/content-providers.html ।
इस तरह आप डेटा लेयर और बिजनेस लॉजिक को अलग कर सकते हैं। आपका डेटा एक्सेस यूरिस के लिए सारगर्भित कर दिया जाएगा। ContentProvider
. का उपयोग करना , आप इसके भीतर अपने प्रश्नों को परिभाषित करते हैं और उरी का उपयोग करके डेटा लोड करते हैं:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return getContentResolver().query(
YourContentProvider.SOME_URI,
null,
null,
null,
null
);
}
यह सुविधाजनक तरीका है यदि आपके डेटा के एक या दो से अधिक ग्राहक हैं (गतिविधियां या टुकड़े) - आप एसक्यूएल प्रश्नों को दोहराने या कई कर्सर लोडर बनाने के बजाय केवल पूर्वनिर्धारित यूरिस का उपयोग करेंगे descendands
।
इसके अलावा, ContentProvider
यदि आप चाहें तो आपके ऐप के बाहर से उपयोग किया जा सकता है।