Подтвердить что ты не робот

Как читать SQLite DB в android с помощью указателя-указателя?

Я настраиваю свое приложение, чтобы люди могли создавать группы своих друзей. Когда группа создается, она записывает 2 таблицы в базу данных SQL. Первая таблица имеет имя группы и идентификатор группы. Вторая таблица имеет 2 столбца, идентификатор группы и идентификатор пользователя. Это нормально работает.

Однако теперь я хочу иметь возможность читать из базы данных. Я использую фрагмент listview с cursorloader, но у меня возникают проблемы с отображением информации. Я хочу перечислить все имена групп из первой таблицы в моем представлении списка.

Моя проблема в том, что, когда я впервые использовал cursorloader для списка моих контактов, я использовал Uri из 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(...) требует во втором аргументе 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();
    }
}

}
4b9b3361

Ответ 1

Это шаги для создания указателя-указателя в фрагменте списка

1) Создайте класс, расширяющий SQLiteOpenHelper и переопределите onCreate и onUpgrade, чтобы создать свои таблицы.

2) Создайте класс, расширяющий ContentProvider, и создайте URI для доступа к вашей базе данных. Обратитесь http://developer.android.com/guide/topics/providers/content-providers.html. Добавьте URI в URIMatcher, который вы используете в onCreate, onUpdate, query и т.д. (Переопределенные методы), чтобы соответствовать URI. См. http://developer.android.com/reference/android/content/UriMatcher.html

3) В вызове метода insert getContext().getContentResolver().notifyChange(uri, null). В методе запроса вызовите setNotificationUri(ContentResolver cr, Uri uri), прежде чем возвращать провайдера содержимого для изменения вставки, чтобы автоматически отражать ваш загрузчик. (fooobar.com/questions/114296/...).

4) Дайте этот URI в onCreateLoader.

Примечание: Без поставщика контента автоматическое обновление изменений в списке не представляется возможным с текущей версии Android. Если вы не хотите, чтобы ваш contentprovider был видимым, установите для экспортированного атрибута в манифесте значение false. Или вы можете реализовать свой пользовательский CursorLoader, как в fooobar.com/questions/54587/..., для извлечения данных из базы данных. Но в этом случае автоматическое обновление данных невозможно

Ответ 2

Android Guide предлагает создать ContentProvider, когда вы хотите поделиться своими данными с другими приложениями. Если вам это не нужно, вы можете просто переопределить метод 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 );
               }
           };