34

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

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

我的问题是,当我第一次使用cursorloader列出我的联系人时,我使用的Uricontent provider方法中的a onCreateLoader。具体来说,我CONTENT_URIContactsContracts.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();
    }
}

}
4

2 回答 2

65

ContentProviderAndroid Guide 建议在您想与其他应用程序共享数据时创建一个。如果你不需要这个,你可以重写类loadInBackgroud()的方法CursorLoader。例如在你的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 );
               }
           };
于 2014-01-24T05:39:43.013 回答
35

这些是在列表片段中创建游标加载器的步骤

1)创建一个类扩展SQLiteOpenHelper和覆盖onCreateonUpgrade创建你的表。

2) 创建一个扩展类ContentProvider并创建 URI 来访问您的数据库。请参阅http://developer.android.com/guide/topics/providers/content-providers.html。将您的 URI 添加到URIMatcher您在onCreateonUpdate、 查询等(覆盖的方法)中使用的 URI 以匹配 URI。参考http://developer.android.com/reference/android/content/UriMatcher.html

3)在插入方法调用getContext().getContentResolver().notifyChange(uri, null)中。在查询方法调用setNotificationUri(ContentResolver cr, Uri uri)返回内容提供程序之前,插入更改会自动反映到您的加载程序。(https://stackoverflow.com/a/7915117/936414)。

4) 在onCreateLoader.

注意:在没有内容提供者的情况下,从当前的 android 版本开始,自动刷新对列表的更改是不可行的。如果您不想让您的 contentprovider 可见,请将清单中的导出属性设置为 false。或者您可以在https://stackoverflow.com/a/7422343/936414中实现自定义 CursorLoader 以从数据库中检索数据。但在这种情况下,无法自动刷新数据

于 2013-08-20T04:46:30.210 回答