11

Necesito hacer un ListAdapter que presente datos de múltiples ContentProviders. Los ContentProviders representan una tabla de la base de datos relacional.CursorLoader para múltiples ContentProviders

Quiero usar el sistema CursorLoader para recuperar datos agregados en ListView. ¿Es posible hacerlo con 1 cargador o necesito usar cargadores múltiples? Preferiría usar uno.

No estoy seguro de cómo puedo tener 2 ContentProviders interactuando entre sí más allá de hacer la unión manualmente en el código que tampoco parece ser una buena opción.

Respuesta

12

Tendrá que escribir una clase Custom Loader. Por ejemplo:

public class FooLoader extends AsyncTaskLoader { 

    Context context; 

    public FooLoader(Context context) { 
     super(context); 
     this.context = context; 
    } 

    @Override 
    public Cursor loadInBackground() { 
     Log.d(TAG, "loadInBackground"); 
     YourDatabase dbHelper = new YourDataBase(context); 
     SQLiteDatabase db= dbHelper.getReadableDatabase(); 

     /*** create a custom cursor whether it is join of multiple tables or complex query**/ 
     Cursor cursor = db.query(<TableName>, null,null, null, null, null, null, null); 
     return cursor; 
    } 
} 

En la actividad de llamada o fragmentos onCreate() método, se tendría que llamar a la clase cargador de encargo:

public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "onCreate():" + mContent); 
     Loader loader = getLoaderManager().initLoader(0, null, this); 
     loader.forceLoad(); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     Log.d(TAG, "onCreateLoader()") ; 
     return new FooLoader(getActivity()); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
     Log.d(TAG, "onLoadFinished");    
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursorLoader) { 
    } 
} 
+0

Lo sentimos, pero "múltiples ContentProviders" no es lo mismo que "múltiples tablas en el db de mi aplicación". Los ContentProviders pueden ser de diferentes aplicaciones, en cuyo caso su solución no es una solución. (Necroposting, pero tal vez alguien tiene una pista) – Giszmo

0

Soy nuevo en ContentLoaders, pero todavía no he visto una forma en que pueda usar un ContentLoader para manejar varios ContentProviders.

¿Las tablas que está consultando en bases de datos separadas? No está claro de tu pregunta. Si todas las tablas están en la misma base de datos, una alternativa podría ser usar un ContentProvider para las tablas separadas. Los datos se pueden unir y devolver a un cursor, lo que significa que puede usar un CursorLoader. Los SQLiteQueryBuilder.setTables() método tiene alguna información sobre esto:

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html#setTables%28java.lang.String%29

y se puede ver en acción aquí:

http://code.google.com/p/openintents/source/browse/trunk/shoppinglist/ShoppingList/src/org/openintents/shopping/provider/ShoppingProvider.java

esto también podría ser útil: https://stackoverflow.com/a/3196484/399105

Cuestiones relacionadas