如何在android中使用cursorloader读取SQLite数据库?

我正在设置我的应用程序,以便人们可以创build他们的朋友组。 创build组时,它将2个表写入SQL数据库。 第一个表格有一个组名称和一个组ID。 第二个表有2列,一个组ID和一个用户ID。 这工作正常。

但是,现在我想能够从数据库中读取。 我用一个cursorloader使用listview片段,但我无法获取信息显示。 我想在列表视图中列出第一个表中的所有组名。

我的问题是,当我第一次使用cursorloader来列出我的联系人时,我正在使用onCreateLoader方法中的content providerUri 。 具体来说,我有CONTENT_URIContactsContracts.Contacts类。

具有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); } 

但是,不使用内容提供者,我不知道要在onCreateLoader方法中放置什么,因为在第二个参数中return new CursorLoader(...)需要一个Uri

任何关于如何能够在列表视图中显示我的数据库数据的build议?

片段类代码:

 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(); } } } 

  • 如何从managedQuery转换到LoaderManager / CursorLoader?
  • 使用Cursor Adapter实现带多个select器的listview
  • Android,使用SimpleCursorAdapter来设置颜色不仅仅是string
  • 修改SimpleCursorAdapter的数据
  • 如何通过单击其中的按钮获取列表项位置?
  • 如何在Android for Android api 11+的列表视图中显示联系人
  • Android:自定义SimpleCursorAdapter中的newView和bindView问题
  • Android的SimpleCursorAdapter使用DISTINCT进行查询
  • 这些是在列表片段中创build一个cursorloader的步骤

    1)创build一个扩展SQLiteOpenHelper的类并重写onCreateonUpgrade来创build表。

    2)创build一个扩展ContentProvider的类并创build访问数据库的URI。 请参阅http://developer.android.com/guide/topics/providers/content-providers.html 。 将您的URI添加到您在onCreateonUpdate ,query等(重写的方法)中使用的URIMatcher以匹配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)在onCreateLoader给出这个URI。

    注意:如果没有内容提供者,自动刷新对列表的更改是不可行的。 如果您不想让contentprovider可见,请将manifest中的导出属性设置为false。 或者您也可以像https://stackoverflow.com/a/7422343/936414中那样实现自定义的CursorLoader来从数据库中检索数据&#x3002; 但在这种情况下,自动刷新数据是不可能的

    Android指南build议创build一个ContentProvider当你想与其他应用程序共享你的数据。 如果你不需要这个,你可以重写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 ); } };