android - एक कर्सरलोडर के साथ एंड्रॉइड में SQLite डीबी कैसे पढ़ा जाए?




android-listview android-fragments (2)

एंड्रॉइड गाइड एक सामग्री ContentProvider बनाने का सुझाव देता है जब आप अपने डेटा को अन्य एप्लिकेशन के साथ साझा करना चाहते हैं। अगर आपको इसकी आवश्यकता नहीं है, तो आप loadInBackgroud() CursorLoader वर्ग के विधि loadInBackgroud() को ओवरराइड कर सकते हैं। उदाहरण के लिए अपने onCreateLoader में इस तरह लिखें:

return new CursorLoader( YourContext, null, YourProjection, YourSelection, YourSelectionArgs, YourOrder )
           {
               @Override
               public Cursor loadInBackground()
               {
                   // You better know how to get your database.
                   SQLiteDatabase DB = getReadableDatabase();
                   // You can use any query that returns a cursor.
                   return DB.query( YourTableName, getProjection(), getSelection(), getSelectionArgs(), null, null, getSortOrder(), null );
               }
           };

मैं अपना ऐप स्थापित कर रहा हूं ताकि लोग अपने दोस्तों के समूह बना सकें। जब कोई समूह बनाया जाता है, तो यह SQL डेटाबेस में 2 टेबल लिखता है। पहली तालिका में समूह का नाम और समूह आईडी है। दूसरी तालिका में 2 कॉलम, एक समूह आईडी और उपयोगकर्ता आईडी है। यह ठीक काम कर रहा है।

हालांकि, अब मैं डेटाबेस से पढ़ने में सक्षम होना चाहता हूं। मैं cursorloader साथ एक cursorloader खंड का उपयोग कर रहा हूं लेकिन मुझे जानकारी प्रदर्शित करने में परेशानी हो रही है। मैं अपनी सूची दृश्य में पहली तालिका से सभी समूह नामों को सूचीबद्ध करना चाहता हूं।

मेरी समस्या यह है कि, जब मैंने पहली बार अपने संपर्कों को सूचीबद्ध करने के लिए cursorloader का उपयोग किया था, तो मैं cursorloader विधि में content provider से Uri का उपयोग कर रहा था। विशेष रूप से मेरे पास ContactsContracts.Contacts से CONTENT_URI था। ContactsContracts.Contacts वर्ग।

cursorloader साथ cursorloader उदाहरण:

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    Uri contentUri = ContactsContract.Contacts.CONTENT_URI;
    return new CursorLoader(getActivity(),contentUri,PROJECTION,SELECTION,ARGS,ORDER);
}

हालांकि, एक सामग्री प्रदाता का उपयोग किए बिना, मुझे नहीं पता कि return new CursorLoader(...) विधि में क्या रखा जाए क्योंकि return new CursorLoader(...) को दूसरी बहस में Uri आवश्यकता होती है।

किसी भी सुझाव के बारे में कोई सुझाव है कि मैं एक सूचीदृश्य में अपना डेटाबेस डेटा कैसे प्रदर्शित कर सकता हूं?

खंड वर्ग कोड:

public class GroupListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {

CursorAdapter mAdapter;
private OnItemSelectedListener listener;
private static final String[] PROJECTION ={GroupContract.GroupDetails.COLUMN_NAME_GROUP_NAME};
private static final String SELECTION = null;
final String[] FROM = {GroupContract.GroupDetails.COLUMN_NAME_GROUP_NAME};
final int[] TO = {android.R.id.text1};
private static final String[] ARGS = null;
private static final String ORDER = null;
private Cursor c;


@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1,null,FROM,TO,0 );
    ReadDBAsync readDB = new ReadDBAsync();
    readDB.execute();
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    setListAdapter(mAdapter);
    getLoaderManager().initLoader(0,null,this);
}

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    Uri contenturi = Uri.parse("content://preamble.oneapp");
    Uri tableuri = Uri.withAppendedPath(contenturi,GroupContract.GroupDetails.TABLE_NAME);
    return new CursorLoader(getActivity(),tableuri,PROJECTION,SELECTION,ARGS,ORDER);
}

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    mAdapter.swapCursor(cursor);
}

@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
    mAdapter.swapCursor(null);
}


private class ReadDBAsync extends AsyncTask<Void,Void,String> {

    @Override
    protected String doInBackground(Void... voids) {

        ContractDBHelpers mDBHelper = new ContractDBHelpers(getActivity());
        SQLiteDatabase db = mDBHelper.getReadableDatabase();
        String returnvalue = "database read";
        c = db.query(GroupContract.GroupDetails.TABLE_NAME,PROJECTION,null,null,null,null,null);
        return returnvalue;
    }

    @Override
    protected void onPostExecute(String result){
        Toast.makeText(getActivity(), result, Toast.LENGTH_LONG).show();
    }
}

}

सूची खंड में कर्सरलोडर बनाने के लिए ये चरण हैं

1) SQLiteOpenHelper विस्तारित करने SQLiteOpenHelper कक्षा बनाएं और अपनी टेबल बनाने के लिए onUpgrade करें और onUpgrade करें।

2) सामग्री ContentProvider विस्तार करने ContentProvider कक्षा बनाएं और अपने डेटाबेस तक पहुंचने के लिए यूआरआई बनाएं। http://developer.android.com/guide/topics/providers/content-providers.html देखें। URIMatcher अपने यूआरआई जोड़ें जो आप यूआरआई से मेल खाने के लिए onUpdate , onUpdate , क्वेरी इत्यादि (ओवरराइड विधियों) पर उपयोग करते हैं। http://developer.android.com/reference/android/content/UriMatcher.html देखें

3) सम्मिलित विधि कॉल में getContext().getContentResolver().notifyChange(uri, null) । क्वेरी लोडर में स्वचालित रूप से आपके लोडर को प्रतिबिंबित करने के लिए सम्मिलन परिवर्तन के लिए सामग्री प्रदाता को लौटने से पहले क्वेरी setNotificationUri(ContentResolver cr, Uri uri) कॉल करें। ( https://.com/a/7915117/936414 )।

4) उस यूआरआई को onCreateLoader में दें।

नोट: सामग्री प्रदाता के बिना, सूची में परिवर्तनों का स्वचालित रीफ्रेशिंग वर्तमान एंड्रॉइड संस्करण के रूप में व्यवहार्य नहीं है। यदि आप अपने कंटेंटप्रोवाइडर को दिखाना नहीं चाहते हैं, तो निर्यात में विशेषता को गलत में प्रकट करें। या आप डेटाबेस से डेटा पुनर्प्राप्त करने के लिए https://.com/a/7422343/936414 में अपने कस्टम कर्सर लोडर को कार्यान्वित कर सकते हैं। लेकिन इस मामले में डेटा का स्वचालित ताज़ा करना संभव नहीं है





android-cursorloader