我正在设置我的应用程序,以便人们可以创建自己的朋友组。创建组后,它将2个表写入SQL数据库。第一个表具有组名和组ID。第二个表有2列,一个组ID和一个用户ID。一切正常。
但是,现在我希望能够从数据库中读取。我正在使用带有的listview片段,cursorloader
但是在获取信息时遇到了麻烦。我想列出列表视图中第一个表中的所有组名。
我的问题是,当我第一次使用cursorloader
列出联系人时,我在方法中使用的Uri
from 。具体来说,我不得不从类。content provider
onCreateLoader
CONTENT_URI
ContactsContracts.Contacts
的例子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(...)
需要a 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
并重写onCreate
,并onUpgrade
以创建表。
2)创建一个扩展类ContentProvider
并创建URI来访问您的数据库。请参阅http://developer.android.com/guide/topics/providers/content-providers.html。将您的URI添加到URIMatcher
您在onCreate
,,onUpdate
查询等(覆盖的方法)中使用的URI,以匹配URI。请参阅http://developer.android.com/reference/android/content/UriMatcher.html
3)在insert方法中调用getContext().getContentResolver().notifyChange(uri, null)
。在查询方法调用setNotificationUri(ContentResolver cr, Uri uri)
之前,返回内容提供者以使插入更改自动反映到您的加载器。(https://stackoverflow.com/a/7915117/936414)。
4)在中输入URI onCreateLoader
。
注意:如果没有内容提供商,从当前的android版本开始,自动刷新列表更改是不可行的。如果您不想显示contentprovider,请将清单中的exported属性设置为false。或者,您也可以像https://stackoverflow.com/a/7422343/936414中那样实现自定义的CursorLoader,以从数据库中检索数据。但是在这种情况下,无法自动刷新数据
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句