¿Cómo leer un DB de SQLite en android con un cursorloader?
Estoy configurando mi aplicación para que la gente pueda crear grupos de sus amigos. Cuando se crea un grupo, escribe 2 tablas en la base de datos SQL. La primera tabla tiene un nombre de grupo y un id de grupo. La segunda tabla tiene 2 columnas, un id de grupo y un id de usuario. Esto está funcionando bien.
Sin embargo, ahora quiero poder leer de la base de datos. Estoy usando un fragmento listview con un cursorloader
pero estoy teniendo problemas para obtener la información que se muestre. Quiero enumerar todos los nombres de grupo de la primera tabla en mi vista de lista.
- Android: ¿Cómo Requerir un Cursor para actualizar ListView después de eliminar la fila de la base de datos?
- Android - Visualización de los resultados del cursor de DB en ListView
- Cómo solucionar esto sólo se debe llamar cuando el cursor es válido utilizando ExpandableListView
- ¿Cómo pasar de managedQuery a LoaderManager / CursorLoader?
- Mostrar número de contacto y nombre de contacto en una vista de lista personalizada
Mi problema es que, cuando utilicé por primera vez el cursorloader
para listar mis contactos, estaba usando un Uri
del content provider
en el método onCreateLoader
. En concreto, tenía CONTENT_URI
de la clase ContactsContracts.Contacts
.
Ejemplo de cursorloader
con 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); }
Sin embargo, sin utilizar un proveedor de contenido, no sé qué poner en el método onCreateLoader
porque return new CursorLoader(...)
requiere un Uri
en el segundo argumento.
¿Alguna sugerencia sobre cómo podría mostrar mis datos de base de datos en una vista de lista?
Código de la clase del fragmento:
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(); } } }
- Cómo mostrar los contactos en un listview en Android para Android api 11+
- Android ListView: scrollTo no funciona
- Agregar un separador de fecha para un SimpleCursorAdapter en Android
- AutoCompleteTextView con CursorLoader y SimpleCursorAdapter
- ListView no se actualiza al agregar a SQLiteDatabase
- Actualizar Android ListView
- ListView vacío si SimpleCursorAdapter cerrado ()
- SimpleCursorAdapter en un ViewPager
Estos son los pasos para crear un cursorloader en un fragmento de lista
1) Cree una clase que extienda SQLiteOpenHelper
y anule onCreate
y onUpgrade
para crear sus tablas.
2) Cree una clase que extienda ContentProvider
y cree los URI para acceder a su base de datos. Consulte http://developer.android.com/guide/topics/providers/content-providers.html . Agregue sus URIs al URIMatcher
que utiliza en onCreate
, onUpdate
, query, etc (métodos sobreescritos) para que coincida con el URI. Consulte http://developer.android.com/reference/android/content/UriMatcher.html
3) En el método insert, llama a getContext().getContentResolver().notifyChange(uri, null)
. En el método de consulta llame a setNotificationUri(ContentResolver cr, Uri uri)
antes de devolver el proveedor de contenido para que el cambio de inserción se refleje automáticamente en su cargador. ( https://stackoverflow.com/a/7915117/936414 ).
4) Dar ese URI en onCreateLoader
.
Nota: Sin un proveedor de contenido, la actualización automática de los cambios de la lista no es factible a partir de la versión actual de Android. Si no desea que su proveedor de contenido sea visible, defina el atributo exportado en manifiesto como false. O puede implementar su CursorLoader personalizado como en https://stackoverflow.com/a/7422343/936414 para recuperar datos de la base de datos. Pero en este caso no es posible actualizar automáticamente los datos
Guía de Android sugiere crear un ContentProvider
cuando desee compartir sus datos con otras aplicaciones. Si no lo necesita, sólo puede anular el método loadInBackgroud()
de la clase CursorLoader
. Por ejemplo, escribe esto en tu 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 ); } };
- Spinner: obtener estado o recibir notificación cuando se abre
- Metadatos de error de Google Play Services v13 en AndroidManifest