11

Potrzebuję utworzyć ListAdapter, który prezentuje dane od wielu dostawców ContentProviders. Dostawcy ContentFroviders reprezentują po jednej tabeli z relacyjnej bazy danych.CursorLoader dla wielu ContentProviders

Chcę użyć systemu CursorLoader w celu pobrania zagregowanych danych do ListView. Czy można to zrobić z 1 ładowarką, czy też muszę korzystać z wielu ładowarek? Wolałbym użyć jednego.

Nie jestem pewien, w jaki sposób mogę 2 ContentProviders interakcji ze sobą poza wykonaniem join ręcznie w kodzie, który nie wydaje się również świetny wybór.

Odpowiedz

12

Będziesz musiał napisać klasę Custom Loader. Na przykład:

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

W działalności wywołującej lub fragmentów onCreate() metoda, trzeba by zadzwonić do niestandardowej klasy ładowarka:

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

Niestety ale "multiple ContentProviders" to nie to samo co "wiele tabel w db". Dostawcy ContentProviders mogą pochodzić z różnych aplikacji, w takim przypadku rozwiązanie nie jest rozwiązaniem. (Necroposting, ale może ktoś ma podpowiedź) – Giszmo

0

Jestem nowicjuszem w ContentLoaders, ale nie widziałem jeszcze sposobu, aby użyć jednego ContentLoadera do obsługi wielu dostawców treści.

Czy tabele, o które pytasz, znajdują się w oddzielnych bazach danych? Z twojego pytania nie wynika jednoznacznie. Jeśli wszystkie tabele znajdują się w tej samej bazie danych, alternatywą może być użycie jednego dostawcy treści dla oddzielnych tabel. Dane można łączyć i zwracać do jednego kursora, co oznacza, że ​​można użyć jednego kursora CursorLoader. W SQLiteQueryBuilder.setTables() metoda ma jakieś informacje na ten temat:

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

i można zobaczyć go w akcji tutaj:

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

może to również być pomocne: https://stackoverflow.com/a/3196484/399105

Powiązane problemy