2010-07-24 33 views
14

Tôi có Trình tạo nội dung tùy chỉnh mà tôi sử dụng để lưu các bản sửa lỗi thu được từ GPS vào cơ sở dữ liệu SQLite. Lớp này ghi đè các phương thức ContentProvider (xóa, chèn, truy vấn ...), nhưng thông báo tôi cũng đã bao gồm một phương thức để truy vấn sửa lỗi cuối cùng.Android: gọi phương thức tùy chỉnh trong ContentProvider

public class FixesContentProvider extends ContentProvider { 
    @Override 
    public int delete(...) { ... } 
    ... 
    @Override 
    public Cursor query(...) { ... } 

    public Cursor getLastFix(Uri uri) { ... } 
} 

Thật dễ dàng để truy vấn dữ liệu từ các dịch vụ hoặc hoạt động khác bằng cách gọi getContentResolver().

ContentResolver cR = getContentResolver(); 
Cursor fixes = cR.query(CONTENT_URI, ...); 

Nhưng tôi không thể gọi phương thức tùy chỉnh của mình (FixesContentProvider#getLastFix). Tôi làm cách nào để gọi các phương thức tùy chỉnh được xác định trong Trình cung cấp nội dung?

Có lẽ tôi không hiểu cách ContentProviders/ContentResolvers hoạt động trong trường hợp này, nhưng chính thức Android documentation provided by Google không rõ ràng theo nghĩa này.

Trả lời

13

Nhưng tôi không thể gọi phương thức tùy chỉnh của mình (FixesContentProvider#getLastFix).

Điều đó hoàn toàn đúng. Tuy nhiên, trong trường hợp này, bạn có thể tận dụng một thực tế: cả hai phương thức querygetLastFix trả về đối tượng Cursor. Vì vậy, những gì tôi làm sẽ thêm một số giá trị cho URI mà bạn chuyển đến query và sau đó quyết định những gì bạn muốn thực sự làm: query hoặc getLastFix. Ví dụ:

public Cursor query(Uri uri,...) { 
    if (uri says it has to return the last fix) 
     return getLastFix(uri); 
    // otherwise, do normal operations... 
    return cursor; 
} 

Trong thực tế, phương pháp query là giả sử để trả lại kết quả, cho một Uri. Vì vậy, nếu bạn cần truy xuất bản sửa lỗi cuối cùng, bạn phải chỉ định trong URI mà bạn muốn sửa chữa lần cuối.

+0

Đó là những gì tôi đã làm. Tôi đã sử dụng UriMatcher.addUri để đối sánh "content: // xxx/fixes" và "content: // xxx/fixes/last" thành hai mã khác nhau, hoạt động tương ứng (như bạn đề xuất) trong một chuyển đổi (myUriMatcher.match (uri)) {case CODE_1: xxx; trường hợp CODE_2: yyy; }. Cảm ơn nhiều. –

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