¿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.

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

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 ); } }; 
  • Utilizar SimpleCursorAdapter.ViewBinder para cambiar el color de TextView
  • Android Listview - no puede seleccionar varios elementos cuando usa un cursor
  • Cómo obtener datos de Cursor en ContextMenu
  • Los métodos onCreateViewHolder y onBindViewHolder de RecyclerView.Adapter no se reciben
  • Causado por: java.lang.IllegalArgumentException: columna '_id' no existe
  • Buscar lista de nombres de género con canciones
  • Cómo establecer onClick escucha de un ImageButton en ViewBinder?
  • Cómo obtener datos en OnItemClickListener desde SimpleCursorAdapter
  • SwapCursor undefined error
  • Cuándo cerrar Cursor utilizado en SimpleCursorAdapter
  • Enfoque para rellenar la vista de lista expandible con la base de datos SQlite local
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.