Ich richte meine App so ein, dass Leute Gruppen ihrer Freunde erstellen können. Wenn eine Gruppe erstellt wird, schreibt sie 2 Tabellen in die SQL-Datenbank. Die erste Tabelle hat einen Gruppennamen und eine Gruppen-ID. Die zweite Tabelle hat 2 Spalten, eine Gruppen-ID und eine Benutzer-ID. Das funktioniert gut.Wie liest man eine SQLite DB in Android mit einem Cursorloader?
Jetzt möchte ich jedoch aus der Datenbank lesen können. Ich verwende ein Listview-Fragment mit einer cursorloader
, aber ich habe Probleme, die Informationen anzuzeigen. Ich möchte alle Gruppennamen aus der ersten Tabelle in meiner Listenansicht auflisten.
Mein Problem ist, dass, wenn ich zum ersten Mal der cursorloader
verwenden meine Kontakte zur Liste, ich war ein Uri
vom content provider
im onCreateLoader
Verfahren. Konkret hatte ich CONTENT_URI
aus der ContactsContracts.Contacts
Klasse.
Beispiel cursorloader
mit 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);
}
jedoch ohne einen Content-Provider mit, ich weiß nicht, was in der onCreateLoader
Methode zu setzen, weil return new CursorLoader(...)
ein Uri
im zweiten Argumente erfordert.
Irgendwelche Vorschläge, wie ich meine Datenbankdaten in einer Listview anzeigen könnte?
Fragment Klassencode:
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();
}
}
}
Haben Sie einen Inhaltsanbieter erstellt, um Ihre Datenbank zu verwalten? – user936414
@ user936414 nein, ist das notwendig? Was sind die Vorteile/Nachteile dabei? Edit: nur lesen Sie es auf, ich brauche nicht die Daten über mehrere Anwendungen zu teilen, so dass ich keinen Content-Provider –