5

tôi đã viết CursorAdapter của riêng mình cho RecyclerView như liên kết sau đây: https://gist.github.com/skyfishjy/443b7448f59be978bc59Làm thế nào để hiển thị dữ liệu từ cơ sở dữ liệu vào RecyclerView với hiệu suất cao?

Sau đó, tôi thấy mỗi khi tôi thay đổi một cái gì đó trong cơ sở dữ liệu và muốn thể hiện nó trong RecyclerView, tôi cần phải tạo ra một con trỏ mới bằng cách db.query() và sử dụng CursorAdpater's changeCursor(). Vì truy vấn() sẽ quét tất cả các hàng trong cơ sở dữ liệu, RecyclerView sẽ làm mới chậm khi số lượng dữ liệu lớn ngay cả khi tôi chỉ chèn một hàng vào cơ sở dữ liệu. Bên cạnh đó, như chúng ta đều biết, RecyclerView cung cấp notifyItemInserted/Removed (position) cho các nhà phát triển để RecyclerView có thể làm mới một phần, đó là hữu ích và có lợi cho bộ nhớ/thời gian. Tuy nhiên, khi tôi sử dụng CursorAdapter, tôi không biết khi nào và làm thế nào tôi có thể sử dụng các phương pháp này vì việc thay đổi con trỏ không thêm trực tiếp vào tập dữ liệu ràng buộc với RecyclerView nhưng làm mới tất cả các mục trong thực tế.

Vì vậy, có cách nào tốt hơn để hiển thị dữ liệu từ cơ sở dữ liệu trong RecyclerView và sử dụng phương pháp cải tiến của RecyclerView để hiển thị nhiều cơ sở dữ liệu không?

Trả lời

4

Tôi có thể cho bạn biết những gì tôi đã làm ... A. Đã tải con trỏ bằng Trình tải. B. Sao chép con trỏ vào danh sách được gắn vào bộ điều hợp (con trỏ không được gắn trực tiếp với bộ điều hợp), đóng con trỏ. Hoạt động tốt nếu không có nhiều dữ liệu - nếu có nhiều hàng thì tôi sẽ tải một số dữ liệu vào danh sách mảng và sau đó khi người dùng cuộn xuống, tôi sẽ truy vấn lại và tải từ hàng cuối cùng của mảng. C. Khi người dùng muốn xóa hoặc thêm thứ gì đó tôi sẽ thực hiện thao tác trên arrayList trước tiên (UI thread) notifiyItemThay đổi và sau đó thay đổi db (Quay lại chủ đề) Hy vọng tôi đã giúp.

+0

Tôi đã xem xét những suy nghĩ tương tự như của bạn nhưng chúng không phải là phương pháp tốt nhất. Thứ nhất, CursorLoader được thiết kế để làm mới dữ liệu có thể thay đổi bất cứ lúc nào. Trong tình huống của tôi, tôi biết khi nào cần làm mới dữ liệu và giao diện người dùng, vì vậy nếu tôi sử dụng CursorLoader, một luồng khác sẽ được tạo và do đó sẽ lãng phí các resouces. Thứ hai, có vẻ dễ dàng sao chép dữ liệu từ con trỏ sang arrayList nhưng nó có cùng vấn đề: bộ nhớ bị lãng phí vì arrayList không thực sự cần ở đây ---- tại sao tôi nên sử dụng arrayList nếu có con trỏ cung cấp dữ liệu? Cuối cùng, Bước C có thể gây ra lỗi. – ywwynm

+0

Tôi sẽ bắt đầu từ cuối, bước c không gây ra lỗi nếu được thực hiện đúng cách. tôi đã sao chép mảng vì tôi muốn có tính năng 'vuốt để xóa' và tôi thực sự thực sự không thích làm bất kỳ thay đổi nào đối với DB trên chuỗi chính. Nó có thể là một 'lãng phí' bộ nhớ (có thể) nhưng hiệu quả của nó với việc sử dụng giao diện người dùng. Một lần nữa, tôi nghĩ rằng một mảng ở đây và có một LOT rẻ hơn sau đó xóa một hàng trong DB trên giao diện người dùng. – EE66

+0

Tôi sắp lấy lời khuyên của bạn. Nhưng tôi nghĩ về một cái gì đó mới: nạp con trỏ, sao chép dữ liệu vào một arrayList trong onCreate của Activity() và liên kết nó với RecyclerView.Adapter. Sau đó, khi tôi muốn thay đổi dữ liệu trên thread UI, tôi chỉ cập nhật arrayList. Cuối cùng, trong onStop() của Activity, tôi sẽ đặt tất cả dữ liệu của arrayList vào cơ sở dữ liệu (chèn các dữ liệu mới, cập nhật những cái đã thay đổi và duy trì những cái đã tồn tại). Nó có tốt hơn không? – ywwynm

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