11

Birden çok ContentProvider'dan veri sunan bir ListAdapter yapmam gerekiyor. ContentProviders kendileri ilişkisel veritabanından her biri bir tabloyu temsil eder.Çoklu ContentProviders için CursorLoader

Toplam verileri ListView'e almak için CursorLoader sistemini kullanmak istiyorum. Bu, 1 yükleyici ile mümkün mü veya birden fazla yükleyici kullanmam gerekiyor mu? Birini kullanmayı tercih ederim.

2 ContentProvider'ın birbiriyle etkileşimde bulunabileceğinden emin değilim.

cevap

12

Özel Yükleyici sınıfı yazmanız gerekecektir. Örneğin:

çağıran aktivitesi veya fragmanları
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; 
    } 
} 

onCreate() yöntem, özel yükleyici sınıf aramak gerekir:

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

Üzgünüz ama "çoklu ContentProviders", "app'ımın db'sindeki birden fazla tablo" ile aynı değil. ContentProviders farklı uygulamalardan olabilir, bu durumda çözümünüz bir çözüm değildir. (Necroposting, ama belki birinin bir ipucu var) – Giszmo

0

Kendimi ContentLoaders uygulamasında yeniyim, ancak henüz birden fazla ContentProvider'ı işlemek için bir ContentLoader kullanabileceğinizi görmedim.

Sorgulama yaptığınız tablolar ayrı veritabanlarında mı? Sorunuzdan belli değil. Tabloların hepsi aynı veritabanındaysa, bunun yerine bir alternatif, ayrı tablolar için bir ContentProvider kullanmak olabilir. Veriler birleştirilebilir ve bir imleçe geri gönderilebilir, bu da bir CursorLoader kullanabileceğiniz anlamına gelir.

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

ve burada eylem görebilirsiniz:

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

bu da yararlı olabilir: https://stackoverflow.com/a/3196484/399105

yöntemi bu konuda bazı bilgiler() SQLiteQueryBuilder.setTables