2 Câu hỏi: Truy vấn SQLite, Chèn, Cập nhật, Xóa, Luôn cần trên Chủ đề nền?

câu hỏi được tạo ra tại Fri, Mar 1, 2019 12:00 AM

Tôi hiện đang sử dụng Trình tải để lấy dữ liệu từ ContentProvider của mình (để cho phép tự động cập nhật các con trỏ của tôi). Cách tiếp cận này rất đơn giản để Truy vấn cơ sở dữ liệu, tuy nhiên, nó có vẻ không phù hợp với bất kỳ hoạt động DB nào khác (chẳng hạn như Chèn, Cập nhật, Xóa).

Câu hỏi của tôi là:

  1. Có phải tất cả các hoạt động SQLite phải nằm trên một luồng nền hoặc có an toàn khi thực hiện các thao tác đơn giản như Chèn, Cập nhật hoặc Xóa một hàng trên luồng UI không?
  2. Thế nào là một thiết kế đẹp để đảm bảo tất cả các truy vấn đi qua một luồng nền? Tôi muốn triển khai AsyncTask, tôi có nên tạo SuperTask để nói rằng mở rộng AsyncTask và Thực thi từng hoạt động SQLite không? (Phần thưởng: Bạn có thể cung cấp ví dụ xương trần không?)
14
  1. Chúng ta nên sử dụng luồng nền cho các hoạt động hàng loạt ..... Việc chèn, cập nhật hoặc xóa một hàng có thể được thực hiện trên luồng UI.
    2016-05-07 08: 11: 19Z
2 Câu trả lời                              2                         

Tôi đã thực hiện các thao tác SQLite trên Chủ đề giao diện người dùng của mình. Tôi đoán câu hỏi thực sự trở thành liệu các truy vấn của bạn sẽ mất nhiều thời gian hay không. Tôi chưa bao giờ gặp sự cố ứng dụng do mất quá nhiều thời gian để thực hiện các cuộc gọi SQL trên cơ sở dữ liệu SQLite của mình.

Như đã nói, nếu bạn dự định viết các truy vấn phức tạp có thể mất thời gian để tải, bạn sẽ muốn chạy nó dưới dạng AsyncTask hoặc Chủ đề và sử dụng các cuộc gọi lại để cập nhật giao diện người dùng của bạn nếu cần.

Đây là một hướng dẫn tuyệt vời về SQLite trên Android (Nó cũng giải quyết một số vấn đề về thời gian sql phức tạp mà bạn đang nói đến): http://www.vogella.com/tutorials/AndroidQueryite/article.html

    
5
2014 /03-12 02: 27: 30Z
  1. Cảm ơn bạn đã trả lời. Tôi đoán, điều này có thể trở nên lộn xộn khá nhanh vì bạn cần xác định AsyncTask mới cho từng loại truy vấn hoặc bạn cần thêm các câu lệnh chuyển đổi vào AsyncTask chính để xử lý mọi thứ, đó là cách thức hoạt động của nó khi thực hiện phân luồng nền AsyncTask?
    2014/03/13: 09: 28Z
  2. Bạn không cần một Tác vụ cụ thể cho từng truy vấn nhưng bạn có thể tạo một Tác vụ cụ thể để xử lý tất cả các yêu cầu cơ sở dữ liệu. Do đó, nó chạy trong nền hoạt động của bạn, tạo ra một loạt các truy vấn và lên lịch các truy vấn và gọi lại trên AsyncTask thực tế. Trong nền, bạn có thể liên tục thực hiện một hook trong cơ sở dữ liệu của mình bằng cách sử dụng BlockingQueue để cung cấp lệnh gọi tới DB của bạn bằng lệnh. Trên giao diện người dùng chủ đề của bạn, bạn chỉ cần thêm một lệnh vào hàng đợi
    2014/03/13 00: 42: 20Z
  1. Tất cả các hoạt động SQLite không cần để ở trên nền, nhưng nên . Ngay cả các cập nhật hàng đơn giản cũng có thể tác động đến luồng UI và do đó phản ứng của ứng dụng.

  2. Android bao gồm lớp trừu tượng AsyncQueryHandler :

      

    Một lớp trình trợ giúp để giúp xử lý các truy vấn ContentResolver không đồng bộ dễ dàng hơn.

Dưới đây là hai cách triển khai ví dụ từ . Một lớp thành viên:

 49 310

Một lớp ẩn danh:

 49 310

Chi tiết khác:

  1. Triển khai AsyncQueryHandler

  2. http://www.trustydroid.com/blog/2014/10/07/USE- asyncqueryhandler-with-content-nhà cung cấp /

4
2017-05-23 12: 08: 35Z
class MyQueryHandler extends AsyncQueryHandler {

    public MyQueryHandler(ContentResolver cr) {
        super(cr);
    }

    @Override
    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
        // query() completed
    }

    @Override
    protected void onInsertComplete(int token, Object cookie, Uri uri) {
        // insert() completed
    }

    @Override
    protected void onUpdateComplete(int token, Object cookie, int result) {
        // update() completed
    }

    @Override
    protected void onDeleteComplete(int token, Object cookie, int result) {
        // delete() completed
    }
}
nguồn đặt đây