SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Làm cách nào để chạy truy vấn SQLite không đồng bộ trên luồng nền?

Có lẽ đây là https://developer.android.com/reference/android/app/LoaderManager.html bộ phần mềm sẽ dành cho bạn.

Ngoài ra, đây là cách triển khai ngắn cho bạn, nhưng đây không phải là RxJava.

Trước tiên, bạn cần triển khai LoaderManager.LoaderCallbacks<Cursor> và thường thì giao diện này được thực hiện bởi Activity (hoặc Fragment).

Trong onCreateLoader , một CursorLoader nên được tạo và trả về. Đây chỉ là một ví dụ với MyCursorLoader là hậu duệ của CursorLoader , nơi bạn có thể thực hiện kết nối với cơ sở dữ liệu và truy vấn.

Trong onLoadFinished bạn phải xử lý con trỏ với các kết quả của truy vấn.

Vui lòng xem xét liên kết đến android.com, được đề cập ở trên.

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
    super.onResume();

    // start loading data using LoaderManager of Activity
    // third argument only has sense in this case
    getLoaderManager().initLoader(0, null, this);
}

private static final String ACTIVITY_NAME = "main_activity";

private void treatCursorRow(Cursor cursor){
    // treat record from cursor
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // this callback is called by LoaderManager in order to obtain CursorLoader
    // here a new one loader is created
    // created loader will be processed by LoaderManager
    return new MyCursorLoader(this, ACTIVITY_NAME);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    // this callback is called when loader finishes load cursor
    // you don't need to destroy loader - just tread the data
    if(data != null)
        while(data.moveToNext())
            treatCursorRow(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    // here you can do something
    // relevant to cancelling of loading data
    // in example, when you have an event that cancels current
    // loading and restarts new one
}

class MyCursorLoader extends CursorLoader {

    private static final String DATABASE_NAME = "my_database";
    private static final int DATABASE_VERSION = 1;
    private String name_param;

    public MyCursorLoader(Context context, String activity_name) {
        super(context);
        name_param = activity_name;
    }

    @Override
    public Cursor loadInBackground() {
        // assuming, that we have implemented SQLiteOpenHelper
        // to treat sqlite-database
        MyDatabaseHelper dbh = new MyDatabaseHelper(
                MainActivity.this,
                DATABASE_NAME,
                null,
                DATABASE_VERSION
        );
        return dbh.getWritableDatabase().rawQuery(
                "SELECT * FROM some_table WHERE name=?",
                new String[]{ name_param }
        );
    }

}

}

Một cách khác, là sử dụng ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html.

Bằng cách này, bạn có thể tách lớp dữ liệu và logic nghiệp vụ. Quyền truy cập dữ liệu của bạn sẽ được tóm tắt thành uris. Sử dụng ContentProvider , bạn xác định các truy vấn của mình trong đó và tải dữ liệu bằng Uri:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return getContentResolver().query(
            YourContentProvider.SOME_URI,
            null,
            null,
            null,
            null
    );
}

Đây là cách thuận tiện nếu bạn có nhiều hơn một hoặc hai khách hàng sử dụng dữ liệu của mình (Hoạt động hoặc Phân đoạn) - bạn sẽ chỉ sử dụng uris được xác định trước thay vì lặp lại các truy vấn sql hoặc tạo nhiều CursorLoaders descendands .

Hơn nữa, ContentProvider có thể được sử dụng từ bên ngoài ứng dụng của bạn nếu bạn muốn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chọn dữ liệu giữa hai ngày từ sqlite db ở định dạng dd-mm-yyyy?

  2. Trình giả lập so với thiết bị Samsung Bộ nhớ thẻ SD

  3. Hướng dẫn SQLite:Mọi thứ bạn cần biết

  4. Tự động tạo khóa tổng hợp trong SQLite

  5. SQLite - Chọn dữ liệu