2013-03-21 33 views
10

Tôi hiện đang phát triển một ứng dụng Android tương tác với một webservice RESTful. Khách hàng có thể thực hiện CRUD đầy đủ trên webservice. Sau khi tìm kiếm các phương pháp hay nhất tôi đã xem Bài phát biểu Google I/O 2010 về các khách hàng REST được trích dẫn trong hầu hết các bài viết.Làm thế nào để thực hiện một kiến ​​trúc REST và ContentProvider đơn giản bằng cách sử dụng Mô hình?

Để sử dụng càng nhiều nền tảng Android càng tốt, tôi quyết định đi với Tùy chọn B bằng cách sử dụng ContentProviderSyncAdapter. Điều này đã cung cấp cho tôi hệ thống tài khoản tích hợp, người quan sát nội dung và đồng bộ định kỳ khi internet khả dụng.

Bởi vì một tính năng rất quan trọng của ứng dụng của chúng tôi là chỉnh sửa và tính khả dụng ngoại tuyến (được sử dụng trong môi trường có tiếp nhận kém), chúng tôi muốn giữ càng nhiều dữ liệu có liên quan càng tốt.

Khách hàng giao tiếp với các máy chủ sử dụng một RESTful API trong Json, dữ liệu từ máy chủ được sử dụng deserialized Gson trên Models (, Plain cũ đối tượng java POJO của).

Để giữ mã rõ ràng và dễ đọc, tôi đã cố gắng xây dựng trình ánh xạ đối tượng của riêng mình thay vì sử dụng trực tiếp Cursor. mapper này cung cấp mặc định CRUD-hoạt động và bản đồ Cursors để Models khi đọc dữ liệu và Models để ContentValues ​​ khi ghi dữ liệu.

Tuy nhiên, kiến ​​trúc này cảm thấy rất cồng kềnh.

  • Trước hết nó là không thể để có được thông tin đáng tin cậy về sự hiện SyncState (để cung cấp thông tin phản hồi cho người dùng). (Now "hack" sử dụng this SO answer)

  • Vấn đề thứ hai là đối với từng loại tài tôi sẽ cần: Một mô hình, A mapper, Một định nghĩa bảng và ContentProvider URI. Đó là rất nhiều mã để quản lý cho chỉ một tài nguyên.

  • Vấn đề thứ ba là yêu cầu Mô hình thông qua người lập bản đồ của tôi tôi đã tự ngăn mình sử dụng CursorLoader trong Hoạt động.

Tóm lại

Tôi đang tìm kiếm một duy trìnhẹ cách để có nội dung ẩn và đồng bộ hóa với một webservice RESTful sử dụng Json. Ngoài ra, tôi muốn có thể sử dụng các mẫu trong mã của tôi vì user.getName() thân thiện với nhà phát triển hơn cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME)); (Hiện đang ẩn trong lớp Mapper của tôi).

Ví dụ tốt về ánh xạ sẽ là Dapper được kết hợp với Dapper Extensions được viết cho .NET nhưng tương tự như cách tiếp cận của tôi, tuy nhiên cách tiếp cận của tôi yêu cầu tất cả các cột và trường được xác định trong nhiều tệp khác nhau (xem bên trên).

Ngoài ra, tôi đang xem xét thả số ContentProvider khỏi mã của tôi vì nó cảm thấy rất cồng kềnh và lỗi thời cho một tác vụ đơn giản như vậy.

+0

IMHO, ContentProvider + Con trỏ tốt hơn cho ListView hơn POJO ... với POJO bạn sẽ gặp nhiều vấn đề với làm mới dữ liệu (cách POJO hoặc POJO của Array/ListArray sẽ biết nếu thay đổi dữ liệu trên máy chủ và bạn đồng bộ hóa nó). về vấn đề: 1 không quan trọng mỗi lần sử dụng cập nhật/chèn/xóa của CP sẽ cố gắng đồng bộ hóa với máy chủ ... 2 do đó, không viết nó một mình ... thực hiện một số máy phát điện mã (fx .: từ XML hoặc chú thích compiletime) hoặc sử dụng chú thích cho thời gian chạy tạo CP ... thứ 3 đúng ... đó là lý do tại sao tôi không sử dụng nó ... – Selvin

+0

Có bất kỳ giải pháp tốt hiện có nào cho # 2 hoặc thậm chí có thể hoàn thiện hơn, cho Ví dụ một thư viện gói mà chỉ đòi hỏi một defenition cho mỗi tài nguyên? Và tôi đồng ý về # 1 và # 3 nhưng chúng tôi sử dụng một số cách tùy chỉnh để hiển thị dữ liệu (canvas). Tôi đoán điều này sẽ được giải quyết bằng cách thực hiện một số loại bộ điều hợp con trỏ. Mặc dù tôi không chắc chắn nếu điều này là có thể với vải. – christiaanderidder

Trả lời

1

Bạn đã cân nhắc sử dụng ORM chưa? Tôi đã thành công với sự kết hợp của OrmLiteJackson trong quá khứ. Bạn sẽ phải viết dịch vụ của riêng bạn để đồng bộ hóa, nhưng OrmLite sẽ chú ý đến việc nâng hạng nặng khi nói đến các mô hình dữ liệu của bạn.

Mặc dù bạn sẽ không nhận được một số tính năng mà kết hợp ContentProvider + SyncAdapter cung cấp (vẫn không có CursorLoader khi bạn đang sử dụng POJO), thiết lập này có thể giảm bớt gánh nặng của một lược đồ phức tạp và/hoặc nhiều loại.

Dưới đây là một ví dụ về một định nghĩa bảng từ trang chủ OrmLite của:

@DatabaseTable(tableName = "accounts") 
public class Account { 
    @DatabaseField(id = true) 
    private String name; 

    @DatabaseField(canBeNull = false) 
    private String password; 
} 

Như bạn thấy, mô hình + bản đồ + định nghĩa bảng đến với nhau rất nhanh chóng và không đau đớn.

+0

Tôi đã xem xét việc sử dụng ORM, nhưng tôi vẫn tự hỏi về thực hành tốt nhất trên Android vì ContentProvider + SyncAdapter không cung cấp một số tính năng bổ sung, nhưng mặt khác yêu cầu nhiều bloat.Tôi sẽ chấp nhận câu trả lời của bạn vì tôi có thể sẽ thử ORM phương pháp vì mục đích dễ đọc và bảo trì. – christiaanderidder

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