android - tablas - ¿Mejores prácticas para consultar la base de datos SQLite en ListFragment con CursorLoader?
tablas android studio (1)
Estoy usando la Biblioteca de compatibilidad de Android en mi proyecto. Configuré ListFragment como se describe en la DevGuide ( http://developer.android.com/reference/android/app/Fragment.html ), y utilizando un simple CursorLoader Christian se usó sin proveedor de contenido ( uso de CursorLoader sin ContentProvider )
La pregunta es dónde, en mi actividad ListFragment / parent, ¿debo abrir la base de datos, devolver el Cursor, crear Adaptor y setListAdapter?
Entonces, en mi aplicación, tengo TítulosFragmento, Fragmento de Detalles, FragmentLayoutActivity, DetailsLayoutActivity.
Es la mejor práctica ...
abrir la base de datos en ListFragment''s
onActivityCreated
y cerrarla en ListFragment''sonDestroy
como en el ejemplo del código a continuación@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Open database playersDatabaseHelper = new PlayersDBAdapter(getActivity()); playersDatabaseHelper.open(); getLoaderManager().initLoader(0, null, this); ... } @Override public void onDestroy() { super.onDestroy(); if (playersDatabaseHelper != null) { playersDatabaseHelper.close(); } }
consultar la base de datos y devolver el cursor en
onCreateLoader
, y crear el adaptador y setListAdapter enonLoadFinished
como en el ejemplo del código a continuación@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. return new MyCursorLoader(getActivity()) { @Override public Cursor loadInBackground() { playersCursor = playersDatabaseHelper.getAllPlayers(); return playersCursor; } }; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // Create an empty adapter we will use to display the loaded data. playersAdapter = new RowAdapter(getActivity(), playersCursor, R.layout.players_overview_row); // Allocate the adapter to the List displayed within this fragment. setListAdapter(playersAdapter); playersAdapter.swapCursor(cursor); // The list should now be shown. if (isResumed()) { setListShown(true); } else { setListShownNoAnimation(true); } }
¿Estoy en el camino correcto o debo mover algunos de esos en algún lugar? ¡Gracias por tu tiempo!
Lo siento, todavía no hay experiencia en CursorLoader y Fragment, pero ya experimenté el uso de SQLiteOpenHelper en el contexto de acceso simultáneo por diferentes hilos y actividades.
Asumiré que PlayersDBAdapter está usando internamente una clase SQLiteOpenHelper. pero no está claro qué están haciendo tus métodos open () y close ()?
Lo que hice:
- defina su SQLiteOpenHelper como un singleton de toda la aplicación , no de toda la actividad como parece hacer
- crea una instancia única de SQLiteOpenHelper en tu aplicación onCreate
- NO libere la instancia SQLiteOpenHelper en ninguna actividad en Destroy, ya que cuando una actividad se detiene, puede que otra tenga que abrir la base de datos.
- Supongo que la instancia de SQLiteOpenHelper debe borrarse en la aplicación enTerminate (no estoy seguro ya que enTerminate casi nunca se llama en la práctica)
- Tengo un objeto DBAdapter que obtiene una referencia SQLiteDatabase con mySQLiteOpenHelper.getWritableDatabase ()
- estos DBAdapter normalmente se asignan en la actividad onCreate y se lanzan en onDestroy
Al menos esto funciona, no se cuelga en una aplicación con varios miles de usuarios. Sugerencias para mejorar que son bienvenidas :-)