2011-07-05 32 views
7

Tôi có ứng dụng Ghi chú đơn giản tương tự chức năng cho mẫu Android NotePad. Một bổ sung là mọi ghi chú đều có Thẻ. Một Note có thể có một số Tag s và một số Tag có thể thuộc về một số Note s - do đó làm cho mối quan hệ nhiều-nhiều này.Nhà cung cấp nội dung Android và mối quan hệ DB nhiều người

Tôi đã hoàn thành thiết kế DB bằng cách sử dụng Khóa ngoại và Bảng ánh xạ. Bây giờ, tôi muốn ứng dụng của tôi cắm vào Khung tìm kiếm của Android, điều này đòi hỏi phải sử dụng một số ContentProvider để hiển thị dữ liệu của tôi.

Có bất kỳ thực tiễn tốt nhất nào để được theo dõi cho trường hợp này không? Tôi đã tìm thấy một vài câu hỏi liên quan đến SO, nhưng hầu hết trong số họ xử lý các mối quan hệ một-nhiều (ví dụ: this one). Tôi đã kết luận từ những câu hỏi này là tốt nhất nên có một ContentProvider mỗi DB và sau đó sử dụng khái niệm Đối sánh để giải quyết nhiều bảng trong DB. Điều đó vẫn còn để lại các câu hỏi khác mở ra.

  1. Cho số Note ID, tôi muốn trả lại tất cả các thẻ được liên kết với Ghi chú đó. Tôi làm cách nào để thiết lập số ContentUri cho trường hợp như vậy? Không phải của "content://myexample/note/#""content://myexample/tag/#" sẽ phục vụ mục đích.

  2. Không có phương pháp nào trong số 6 ContentProvider mà tôi ghi đè sẽ phù hợp với mục đích đó, phải không? Tôi có thể tất nhiên, giới thiệu một phương pháp mới, nhưng điều đó sẽ không được hiểu bởi người tiêu dùng của tôi ContentProvider.

Cảm ơn trước đề xuất của bạn.

Trả lời

5

Có bạn cần triển khai nó bằng cách sử dụng ContentProvider khi bạn muốn thực hiện tìm kiếm.

Bạn có thể sử dụng nhà cung cấp nội dung hiện có của mình để truy xuất các thẻ được liên kết với ghi chú.

bạn có thể xác định một URL khác có dạng "nội dung: // myexample/note/tag/#" để nhận tất cả các thẻ được liên kết với một nút cụ thể.

Bạn sẽ cần phải thêm một URI khác phải khớp với URI của bạn. nói điều gì đó như GET_NOTE_TAGS = 3;

Trong phương thức getType của Trình tạo nội dung, hãy trả về loại mime thích hợp. Tôi sẽ đoán rằng wil này giống như loại mime cho các thẻ, vì bạn đang trả lại các thẻ giống nhau.

Sau đó, trong các phương thức truy vấn/cập nhật/xóa/chèn phân tích URI đến để khớp với URI: "content: // myexample/note/tag/#". Sau đó, triển khai truy vấn của bạn một cách thích hợp trên cơ sở dữ liệu hoặc nội dung của bạn và trả lại các thẻ mà bạn cần trả lại.

Giản đồ "nội dung: // myexample/note/tag/#" chỉ là một ví dụ và bạn có thể sử dụng nhiều URI trong cùng một ContentProvider.

Bạn cũng đã nói rằng bạn phải tham gia các bảng. có thể được thực hiện bằng cách sử dụng db.query và nếu nó trở nên phức tạp, bạn có thể sử dụng rawqueries, để lấy dữ liệu khi bạn cần từ cơ sở dữ liệu.

+0

Cảm ơn gợi ý về nội dung '": // myexample/note/tag/# "'. Tôi chấp nhận điều này như một câu trả lời vì nó đã giúp tôi trên con đường của tôi. – curioustechizen

9

Bây giờ, tôi tìm thấy một số nội dung thú vị về mối quan hệ nhiều người dùng trong Android ContentProvider. Câu trả lời đến từ mã nguồn Google Offcial Android Client của Google I/O 2011.Ví dụ: trong ứng dụng Google I/O, có một mục có tên là Session và một mục nhập khác là Speaker. Một Session có thể có một số Speaker và một Speaker sẽ tham dự một số Session.

Vì vậy, chúng ta hãy có một cái nhìn về giải pháp của google:

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleProvider.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleContract.java

https://github.com/google/iosched/blob/2011/android/src/com/google/android/apps/iosched/provider/ScheduleDatabase.java

Có lẽ câu trả lời này sẽ giúp các bạn.

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