2015-07-16 14 views
9

Con trỏ Android SQLite có tải tất cả dữ liệu cho truy vấn vào bộ nhớ hay không hoặc có một số loại chiến lược tối ưu hóa nào là một phần của quá trình triển khai?Con trỏ Android SQLite có tải tất cả các bản ghi vào bộ nhớ cùng một lúc không?

+1

Chỉ vì tò mò, tại sao bạn mong đợi rằng con trỏ SQLite có hành vi mặc định khác trên Android so với các nền tảng khác? –

+0

@LevLandau: Tôi không có kỳ vọng đó. Nhưng vì tôi đặc biệt quan tâm đến SQLite trên Android, tôi đã đặt câu hỏi của mình càng hẹp càng tốt. –

+2

Hãy xem [this] (https://groups.google.com/forum/#!topic/android-developers/QX0pI5bth8I) – GVillani82

Trả lời

9

A SQLiteCursor điền vào một "cửa sổ" có dữ liệu khi bạn điều hướng qua nó. Nhớ lại của tôi là kích thước cửa sổ là 1MB, nhưng tôi không thể chỉ cho bạn mã cụ thể sao lưu hồi ức đó. Vì vậy, đối với các truy vấn nhỏ, hiệu ứng ròng là SQLiteCursor sẽ giữ toàn bộ kết quả được đặt trong bộ nhớ, khi bạn bắt đầu truy cập các hàng và cột.

+0

Trong SDK 23.0.1. Đó là 2MB. Xin vui lòng xem câu trả lời của tôi – hqt

+1

Điều gì xảy ra sau khi giới hạn bộ nhớ? Con trỏ có cần quay lại và đọc cơ sở dữ liệu từ chuỗi giao diện người dùng để nhận thêm dữ liệu không? – whizzle

+0

@whizzle: Có lẽ. – CommonsWare

3

Con trỏ không chứa tất cả các kết quả trong bộ nhớ nhưng nó có tổng số truy vấn được trả về (thông qua getCount). Trong khi bạn lặp lại kết quả, nó lấy các mục nhập (không phải từng cái một mà tôi đoán nhưng có lẽ trong các khối). Tôi khá chắc chắn có tối ưu hóa ở cấp độ này. Một khi bạn đã hoàn thành nó, bạn phải đóng nó - nếu không thì tại sao hệ thống giữ nó mở sau khi truy vấn đã được thực hiện.

9

Cảm ơn bạn đã CommonsWare về số Window vì vậy tôi đã đảo ngược lại Android bằng cách điều hướng các lớp đó SQLiteCursor -> AbstractWindowedCursor -> CursorWindow. Dưới đây là CursorWindow constructor:

public CursorWindow(String name) { 
     mStartPos = 0; 
     mName = name != null && name.length() != 0 ? name : "<unnamed>"; 
     if (sCursorWindowSize < 0) { 
      /** The cursor window size. resource xml file specifies the value in kB. 
      * convert it to bytes here by multiplying with 1024. 
      */ 
      sCursorWindowSize = Resources.getSystem().getInteger(
       com.android.internal.R.integer.config_cursorWindowSize) * 1024; 
     } 
     mWindowPtr = nativeCreate(mName, sCursorWindowSize); 
     if (mWindowPtr == 0) { 
      throw new CursorWindowAllocationException("Cursor window allocation of " + 
        (sCursorWindowSize/1024) + " kb failed. " + printStats()); 
     } 
     mCloseGuard.open("close"); 
     recordNewWindow(Binder.getCallingPid(), mWindowPtr); 
    } 

Như bạn thấy, sCursorWindowSize là kích thước mà CommonsWare đã đề cập:

sCursorWindowSize = Resources.getSystem().getInteger(
       com.android.internal.R.integer.config_cursorWindowSize) * 1024; 

Như phiên bản hiện tại của tôi là Android SDK 23.0.1, giá trị của com.android.internal.R.integer.config_cursorWindowSize là 2048. Nó có nghĩa là 2MB . Tôi không có một phiên bản SDK khác để kiểm tra.

+2

Cảm ơn một số nghiên cứu tuyệt vời và hữu ích !. –

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