11

Tôi cần tạo một ListAdapter trình bày dữ liệu từ nhiều trình ContentProvider. Bản thân các ContentProvider đại diện cho một bảng từ cơ sở dữ liệu quan hệ.Trình tải con trỏ cho nhiều nhà cung cấp nội dung

Tôi muốn sử dụng hệ thống CursorLoader để truy xuất dữ liệu tổng hợp vào ListView. Điều này có thể thực hiện với 1 bộ tải hay tôi có cần sử dụng nhiều bộ tải không? Tôi muốn sử dụng nó.

Tôi không chắc chắn làm cách nào để có 2 ContentProviders tương tác với nhau ngoài việc thực hiện phép nối thủ công trong mã mà dường như không phải là một tùy chọn tuyệt vời.

Trả lời

12

Bạn sẽ phải viết một lớp Trình tải tùy chỉnh. Ví dụ:

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

Trong hoạt động gọi điện thoại hoặc mảnh onCreate() phương pháp, bạn sẽ cần phải gọi lớp loader tùy chỉnh:

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

Xin lỗi nhưng "nhiều ContentProviders" không giống như "nhiều bảng trong db của ứng dụng của tôi". Trình ContentProviders có thể là từ các ứng dụng khác nhau, trong trường hợp đó giải pháp của bạn không phải là giải pháp. (Necroposting, nhưng có lẽ ai đó có một gợi ý) – Giszmo

0

Tôi mới sử dụng ContentLoaders, nhưng tôi chưa thấy cách bạn có thể sử dụng một Trình tải nội dung để xử lý nhiều Trình cung cấp nội dung.

Các bảng bạn đang truy vấn trong các cơ sở dữ liệu riêng biệt phải không? Nó không rõ ràng từ câu hỏi của bạn. Nếu tất cả các bảng đều nằm trong cùng một cơ sở dữ liệu, một phương án thay thế có thể là sử dụng một ContentProvider cho các bảng riêng biệt. Dữ liệu có thể được nối và trả về một con trỏ, có nghĩa là bạn có thể sử dụng một CursorLoader. Các SQLiteQueryBuilder.setTables() phương pháp có một số thông tin về vấn đề này:

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

và bạn có thể nhìn thấy nó trong hành động ở đây:

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

này cũng có thể hữu ích: https://stackoverflow.com/a/3196484/399105

Các vấn đề liên quan