2011-09-28 19 views
44

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 el uso de un CursorLoader Christian simple se usó sin el proveedor de contenido (CursorLoader usage without ContentProvider).¿Mejores prácticas para consultar la base de datos SQLite en ListFragment con CursorLoader?

La pregunta es donde, en mi actividad ListFragment/parent, ¿debo abrir la base de datos, devolver el cursor, crear el adaptador y setListAdapter?

Así que en mi aplicación, tengo TítulosFragmento, DetallesFragmento, FragmentLayoutActivity, DetailsLayoutActivity.

es la mejor práctica ...

  • para abrir la base de datos en ListFragment de onActivityCreated y cerrar en ListFragment de onDestroy como en el ejemplo de código

    @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(); 
        } 
    } 
    
  • base de datos de consulta y devuelve el cursor en onCreateLoader, y crea el adaptador y setListAdapter en onLoadFinished como en el ejemplo de 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!

+0

¿Podría alguien comentar mi pregunta, por favor? – micadelli

+0

¿Alguna vez recibió una respuesta? Me sorprende que tengas 14 votos y ninguna respuesta realmente. – kpierce8

+0

Sí, nunca recibió una respuesta :( – micadelli

Respuesta

6

No tengo experiencia en CursorLoader todavía y Fragment, pero ya experimenté el uso de SQLiteOpenHelper en el contexto de acceso simultáneo por diferentes hilos & actividades.

Supongo que PlayersDBAdapter utiliza internamente una clase SQLiteOpenHelper. pero no está claro qué están haciendo tus métodos open() y close()?

Lo que hice:

  • definir su SQLiteOpenHelper como una aplicación amplia Singleton, no la actividad de ancho como parece hacer
  • instantiate SQLiteOpenHelper única instancia en su aplicación onCreate
  • no lo hacen libera la instancia de SQLiteOpenHelper en cualquier actividad en Destroy, ya que cuando una actividad se detiene, puede que otra tenga que abrir el DB
  • Supongo que la instancia de SQLiteOpenHelper debe borrarse en una p plicatura onTerminate (no estoy seguro como onTerminate es en la práctica casi nunca llama)
  • tengo dbAdapter objeto que obtiene una referencia SQLiteDatabase con mySQLiteOpenHelper.getWritableDatabase()
  • estos dbAdapter se asigna normalmente en la actividad onCreate y lanzado en OnDestroy

Al menos esto funciona, no se cuelga en una aplicación con varios miles de usuarios. Sugerencias para mejorar que son bienvenidas :-)

+1

Esa es de hecho una buena solución.He usado este método en cuatro de mis aplicaciones y funciona como un encanto. Obtengo un error ocasional en Android 2.2 y versiones posteriores, pero con 2.3+ funciona como un amuleto. –

+0

Mi aplicación es compatible desde Android 1.5 y no tengo ninguna excepción en esto. Acabo de experimentar un raro "SQLiteDiskIOException: error de E/S de disco" en algunos dispositivos específicos, pero supongo que está relacionado con el problema del acceso a Sdcard o algo así. – Thierry

Cuestiones relacionadas