Sto configurando la mia app in modo che le persone possano creare gruppi di amici. Quando viene creato un gruppo, scrive 2 tabelle nel database SQL. La prima tabella ha un nome di gruppo e un identificativo di gruppo. La seconda tabella ha 2 colonne, un id di gruppo e un id utente. Funziona beneCome leggere un DB SQLite in Android con un cursore di caricamento?
Tuttavia, ora voglio essere in grado di leggere dal database. Sto usando un frammento listview con un cursorloader
ma ho problemi a visualizzare le informazioni. Voglio elencare tutti i nomi dei gruppi dalla prima tabella nella mia visualizzazione elenco.
mio problema è che, quando ho usato il cursorloader
per elencare i miei contatti, stavo usando un Uri
dal content provider
nel metodo onCreateLoader
. Nello specifico ho avuto CONTENT_URI
dalla classe ContactsContracts.Contacts
.
Esempio di cursorloader
con contentprovider
:
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
Uri contentUri = ContactsContract.Contacts.CONTENT_URI;
return new CursorLoader(getActivity(),contentUri,PROJECTION,SELECTION,ARGS,ORDER);
}
Tuttavia, senza l'utilizzo di un fornitore di contenuti, non so cosa mettere nel metodo onCreateLoader
perché return new CursorLoader(...)
richiede un Uri
nel secondo argomento.
Qualche suggerimento su come potrei essere in grado di visualizzare i dati del mio database in una lista?
frammento di codice classe:
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();
}
}
}
Avete creato un fornitore di contenuti per gestire il database? – user936414
@ user936414 no, è necessario? quali sono i vantaggi/gli svantaggi di farlo? Modifica: basta leggere su di esso, non ho bisogno di condividere i dati su più applicazioni, quindi non ho bisogno di un fornitore di contenuti –