7

Tôi có phương thức tùy chỉnh save() trong lớp ContentProvider tùy chỉnh của mình MyContentProvider mà tôi muốn gọi qua Trình phân giải nội dung. Mục tiêu là chuyển POJO với tư cách là một Gói thông qua MyContentProvider.Làm cách nào để gọi phương thức tùy chỉnh trong ContentProvider thông qua ContentResolver và truy cập Bundle sau đó?

Tôi đang sử dụng phương pháp call như đã đề cập here và được xác định here.

Tôi không gặp bất kỳ lỗi nào. Phương pháp này không được truy cập.

The (rút ngắn), tùy chỉnh ContentProvider với phương pháp tùy chỉnh như sau:

public class MyContentProvider extends ContentProvider { 

    public void save() { 

     Log.d("Test method", "called"); 
    } 
} 

Tôi gọi nó là như thế này:

ContentResolver contentResolver = context.getContentResolver(); 
Bundle bundle = new Bundle(); 
bundle.putSerializable("pojo", getPojo()); 
contentResolver.call(Contracts.CONTENT_URI, "save", null, bundle); 

Tại sao phương pháp save không bao giờ gọi và nếu tôi nhận được đến thời điểm này làm cách nào để truy cập Uri và Gói được gọi theo phương thức save()? Tôi không thể tìm thấy bất kỳ tài liệu tham khảo cho điều này bất cứ nơi nào trên SO hoặc web.

Cảm ơn câu trả lời của bạn!

+2

bạn phải ghi đè phương thức gọi trong CP của bạn ... và sau đó gọi chức năng lưu từ đó ... – Selvin

+0

@Selvin Điều đó hoạt động! Cảm ơn bạn. Nếu bạn thêm nó như là một câu trả lời tôi chấp nhận nó. – OpenHaus

Trả lời

16

Tôi vừa mới chơi trò chơi này để có chức năng tùy chỉnh hoạt động. Như đã đề cập trong các bình luận về câu hỏi của bạn, chính là việc thực hiện các phương pháp gọi() trong các nhà cung cấp nội dung để xử lý các phương pháp khác nhau mà bạn có thể vượt qua trong

cuộc gọi của tôi đến ContentResolver trông như thế này:.

ContentResolver cr = getContentResolver(); 

cr.call(DBProvider.CONTENT_URI, "myfunction", null, null); 

Bên trong ContentProvider, tôi đã thực hiện các chức năng cuộc gọi và nó kiểm tra tên phương pháp được thông qua năm:

@Override 
public Bundle call(String method, String arg, Bundle extras) { 
    if(method.equals("myfunction")) { 
     // Do whatever it is you need to do 
    } 
    return null; 
} 

đó dường như làm việc.

+0

Lưu ý rằng so sánh chuỗi ở trên nên được thực hiện với method.equals() thay vì ==. – NigelK

+0

Cảm ơn @nigelk, tôi đã sửa lại câu trả lời của mình. – Andrew

+1

Một nhận xét khác, phương thức gọi chỉ khả dụng ở cấp API 11 trở lên. – Andrew

-2

Nếu bạn muốn xác định lại ContentProvider của riêng bạn, bạn cần phải ghi đè lên các phương pháp:

  • onCreate()
  • truy vấn()
  • xóa()
  • chèn()
  • cập nhật()
  • getType()

Nhưng phương thức save() không nằm trong vòng đời của trình ContentProvider và không thể gọi.

+0

Trên đây chỉ là phiên bản rút gọn của lớp ContentProvider tùy chỉnh của tôi. Tất cả các phương pháp được đề cập là có. Vui lòng xem tài liệu tham khảo của tôi. Có thể xác định và gọi các phương thức tùy chỉnh. Tôi đáng lẽ phải hỏi chữ ký của phương thức tùy chỉnh sẽ trông như thế nào. – OpenHaus