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?
Trả lời
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.
Trong SDK 23.0.1. Đó là 2MB. Xin vui lòng xem câu trả lời của tôi – hqt
Đ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
@whizzle: Có lẽ. – CommonsWare
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.
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.
Cảm ơn một số nghiên cứu tuyệt vời và hữu ích !. –
- 1. Hibernate: Tránh đọc tất cả các bản ghi vào bộ nhớ cùng một lúc
- 2. Tìm kiếm solitaire Sunspot, cách trả lại tất cả các bản ghi cùng một lúc?
- 3. Có thể giảm thiểu tất cả các chức năng tại Android Studio cùng một lúc không?
- 4. Làm thế nào tôi có thể xóa tất cả các bản ghi từ một TClientDataset cùng một lúc?
- 5. Đó có phải là một rò rỉ bộ nhớ để push_back một con trỏ vào một vector của con trỏ?
- 6. tạo nhiều con trỏ NULL cùng một lúc
- 7. Có thể nhiều luồng ghi vào một tập tin cùng một lúc, nếu tất cả các luồng được ghi vào các vị trí khác nhau?
- 8. Tải con trỏ hoạt ảnh khi chạy từ bộ nhớ
- 9. LLDB: Hiển thị tất cả các đối tượng có con trỏ đến một đối tượng trong bộ nhớ
- 10. Ghi vào bộ nhớ riêng trong Android
- 11. Làm thế nào để bạn tải lại tất cả các cửa sổ vim cùng một lúc?
- 12. Đồng thời ghi vào các vị trí khác nhau trong cùng một dòng bộ nhớ cache
- 13. jQuery Xóa Lớp CSS khỏi tất cả các Con cháu cùng một lúc
- 14. Vẽ một phần hình ảnh thành màn hình (không tải tất cả vào bộ nhớ)
- 15. Có cách nào để sửa tất cả các tin nhắn MATLAB mlint cùng một lúc không?
- 16. Xử lý các bảng và con trỏ SQLite trên Android
- 17. Kiểu cam kết Git: Tất cả các tệp đã thay đổi cùng một lúc hoặc một tệp cùng một lúc?
- 18. Đối với Java, tôi có thể nhập tất cả các gói cùng một lúc không?
- 19. phân bổ bộ nhớ cho con trỏ
- 20. Thông báo lỗi không khí: "không thể nhận tất cả các mục này cùng một lúc"
- 21. Có một ResultSet tải tất cả dữ liệu vào bộ nhớ hoặc chỉ khi được yêu cầu?
- 22. Tạo nhiều bản ghi đa hình cùng một lúc ray
- 23. Làm thế nào để xóa tất cả các bản ghi liên kết với một mô hình ember mà không xóa bộ nhớ cục bộ?
- 24. Xóa bản ghi từ nhiều bảng cùng một lúc?
- 25. Hủy tất cả yêu cầu sửa lại cùng một lúc?
- 26. Nhiều luồng có thể ghi dữ liệu vào một tệp cùng lúc không?
- 27. Android: Ghi âm và phát trực tuyến cùng lúc
- 28. Số JavaScript, tất cả cùng kích thước trong bộ nhớ?
- 29. Phong cách tất cả các UITextField cùng một lúc chứ không phải trong mỗi ViewController?
- 30. htaccess ghi đè tất cả các trang vào cùng một trang trên một tên miền khác
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? –
@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. –
Hãy xem [this] (https://groups.google.com/forum/#!topic/android-developers/QX0pI5bth8I) – GVillani82