我正在设置我的应用程序,以便人们可以创建他们的朋友组。创建组时,它将2个表写入SQL数据库。第一个表格有一个组名和一个组ID。第二个表格有2列,一个组ID和一个用户ID。这工作正常。如何使用cursorloader在android中读取SQLite数据库?
但是,现在我想能够从数据库中读取。我正在使用一个带有cursorloader
的listview片段,但我无法获取要显示的信息。我想在列表视图中列出第一个表中的所有组名。
我的问题是,当我第一次在onCreateLoader
方法所使用的cursorloader
列出我的联系人,我使用的是Uri
从content provider
。具体来说,我从ContactsContracts.Contacts
类有CONTENT_URI
。
的cursorloader
与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);
}
然而,如果没有使用内容提供商,我不知道要放什么东西在onCreateLoader
方法,因为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();
}
}
}
你是否创建了一个内容提供者来管理你的数据库? – user936414
@ user936414不,这是必要的吗?这样做的好处/坏处是什么?编辑:只需阅读它,我不需要跨多个应用程序共享数据,所以我不需要一个内容提供商 –