Как читать SQLite DB в android с помощью cursorloader?
я настраиваю свое приложение, чтобы люди могли создавать группы своих друзей. При создании группы она записывает 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
во втором аргумент.
любое предложение о том, как я мог бы отображать данные базы данных в listview?
код класса фрагмент:
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();
}
}
}
2 ответов
это шаги для создания cursorloader в фрагменте списка
1) Создайте класс extending SQLiteOpenHelper
и переопределить onCreate
и onUpgrade
для создания таблиц.
2) Создайте класс extending ContentProvider
и создайте URI для доступа к вашей базе данных. См.http://developer.android.com/guide/topics/providers/content-providers.html. Добавьте URIs в URIMatcher
что вы используете в onCreate
, onUpdate
запрос и т. д. (переопределенные методы), чтобы соответствовать Ури. См. http://developer.android.com/reference/android/content/UriMatcher.html
3) в вызове метода insert getContext().getContentResolver().notifyChange(uri, null)
. В методе запроса call setNotificationUri(ContentResolver cr, Uri uri)
перед возвратом контент-провайдера для изменения вставки автоматически отразится на загрузчике. (https://stackoverflow.com/a/7915117/936414).
4) Дайте этот URI в onCreateLoader
.
Примечание.: Без поставщика контента автоматическое обновление изменений в список не представляется возможным, как из текущей версии android. Если вы не хотите, чтобы ваш contentprovider был видимым, задайте для атрибута exported в manifest значение false. Или вы можете реализовать свой пользовательский CursorLoader, как вhttps://stackoverflow.com/a/7422343/936414 для извлечения данных из базы данных. Но в этом случае автоматическое обновление данных невозможно
Android руководство предлагает создать 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 );
}
};