2010-08-30 35 views
5

Tôi có câu hỏi chung về thiết kế Android xung quanh việc truy cập dữ liệu. Tôi có một số hoạt động trong ứng dụng của tôi cần truy cập cơ sở dữ liệu SQLite. Để kết thúc tất cả các truy cập dữ liệu logic ở một nơi, tôi đã tạo ra một lớp DatbaseHandler để quản lý tất cả các truy cập dữ liệu logic. Lớp này sẽ quan tâm đến việc xây dựng các mệnh đề, gọi cơ sở dữ liệu và thẩm vấn con trỏ kết quả để truy xuất các kết quả truy vấn và trả lại chúng cho người gọi. Mục đích của lớp này là bao bọc tất cả các mã truy cập dữ liệu ở một nơi để nó có thể dễ dàng quản lý và duy trì như trái ngược với việc truy cập dữ liệu logic nằm rải rác trên tất cả các hoạt động. Mỗi hoạt động cần truy cập vào cơ sở dữ liệu sẽ tạo ra một cá thể của lớp DatabaseHandler này và chuyển cho nó một tham chiếu của android.content.Context. Lớp DatabaseHandler sau đó sử dụng đối tượng Context này để gọi một nhà cung cấp nội dung cơ bản như sau context_i.getContentResolver(). Query (...).Phương pháp tiếp cận thiết kế truy cập cơ sở dữ liệu Android

Logic truy cập dữ liệu của tôi (logic xử lý con trỏ cụ thể) không có trong hoạt động và vì vậy tôi không thể quản lý vòng đời của con trỏ, do đó có khả năng bị rò rỉ bộ nhớ.

Câu hỏi của tôi là như sau -

  1. Làm thế nào tôi có thể (nếu nó thậm chí có thể) quản lý chu kỳ con trỏ cuộc sống từ bên ngoài một Hoạt động?
  2. Mỗi hoạt động có nên tạo ra một thể hiện của lớp xử lý dữ liệu này và truyền một thể hiện Ngữ cảnh cho nó không? Có lẽ cách tiếp cận thiết kế của tôi là sai và tôi nên trưng ra các hàm truy cập dữ liệu này dưới dạng các phương thức tĩnh lấy một cá thể của hoạt động gọi điện làm tham số. Bằng cách đó, tôi có thể thực hiện các truy vấn được quản lý và cho phép hoạt động chăm sóc quản lý vòng đời của con trỏ?

Tôi thực sự muốn hiểu rõ về cách tiếp cận tốt nhất. Lời khuyên nào sẽ được đánh giá cao

Trả lời

2

Cách tiếp cận tiêu chuẩn:
Thông thường nếu bạn có một ContentProvider được viết bởi chính mình và bạn đăng ký một cách chính xác trong tập tin manifest.xml của bạn, bạn chỉ có thể làm (ví dụ)

@Override 
public void onCreate(Bundle savedInstanceState){ 
    ... 

    if (getIntent().getData() == null) { 
     getIntent().setData(MyMetaData.CONTENT_URI); 
    } 

    Cursor cursor = managedQuery(getIntent().getData(), null, null, null, null); 

    //create an appropriate adapter and bind it to the UI 
    ... 
} 

này sẽ tự động gọi ContentProvider đó là khả năng xử lý các uri nội dung được đưa ra, đưa cho bạn đăng ký nó trong file manifest.xml như

<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" /> 

Tôi luôn đề nghị mọi người xem qua số Notepad example để tìm hiểu cách triển khai ContentProviders.

Alternatives:
Nói chung, nếu bạn cần truy cập vào dữ liệu của bạn chỉ trong vòng hoạt động của bạn tôi sẽ dính vào "cách tiếp cận tiêu chuẩn" sử dụng ContentProviders, mà btw. có lẽ làm cho nó trở thành giải pháp linh hoạt nhất.
Nếu giải pháp của bạn cần để truy cập dữ liệu từ các lớp không hoạt động mà bạn không có metods "managedQuery", thì bạn có thể triển khai một số loại DAO (Đối tượng truy cập dữ liệu). Ví dụ có thể là

public class MyDataDao implements IMyDataDao { 
    private ContentResolver contentResolver; 

    public MyDataDao(ContentResolver contentResolver){ 
     this.contentResolver = contentResolver; 
    } 


    @Override 
    public MyDataObject readMyDataObjectById(long id){ 
     MyDataObject result = null; 

     Cursor myDataObjectCursor = contentResolver.query(...); 
     if(myDataObjectCursor != null && myDataObjectCursor.moveToFirst()){ 
     result = new MyDataObject(); 
     result.setTitle(myDataObjectCursor.get..); 
     ... 
     } 
     myDataObjectCursor.close(); 

     return result; 
    } 
} 

Điều đó cũng có thể hoạt động.Sau đó bạn gọi DAO của bạn

IMyDataDao dao = new MyDataDao(context.getContentResolver()); 
MyDataObject anObj = dao.readMyDataObjectById(10); 
... 

Hy vọng rằng sẽ chỉ bạn đi đúng hướng :)

+0

Cám ơn câu trả lời của bạn Juri nhưng tôi nghĩ rằng bạn có lẽ hiểu sai câu hỏi. Tôi đã có một nhà cung cấp nội dung và một đối tượng truy cập dữ liệu tại chỗ. (Tôi đã sửa đổi một chút câu hỏi từ trên cao để làm cho họ rõ ràng hơn một chút). 1. Làm thế nào tôi có thể (nếu có thể) quản lý vòng đời của con trỏ từ bên ngoài một Hoạt động (bên trong đối tượng truy cập dữ liệu của tôi)? 2. Mỗi hoạt động có nên tạo một cá thể của đối tượng truy cập dữ liệu này và truyền một thể hiện Ngữ cảnh cho nó không? Có lẽ DAO nên phơi bày các phương pháp tĩnh để mỗi hoạt động không cần phải tạo ra một thể hiện của đối tượng truy cập dữ liệu? – Brian

+0

Tôi đã cung cấp một ví dụ để xử lý con trỏ bên ngoài hoạt động, tức là trong đối tượng DAO của bạn. Tất nhiên bạn nên xem xét việc tạo ra singleton trường hợp của các đối tượng dao của bạn, những người tĩnh thường là xấu để kiểm tra đơn vị nếu bạn quan tâm abou đó. – Juri

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