SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Bagaimana cara menjalankan kueri SQLite secara asinkron di utas latar belakang?

Mungkin https://developer.android.com/reference/android/app/LoaderManager.htmlini cocok untuk Anda.

Selain itu, ini adalah implementasi singkat untuk Anda, tetapi ini bukan RxJava.

Pertama, Anda perlu mengimplementasikan LoaderManager.LoaderCallbacks<Cursor> , dan biasanya antarmuka ini diimplementasikan oleh Aktivitas (atau Fragmen).

Di onCreateLoader , sebuah CursorLoader harus dibuat dan dikembalikan. Berikut adalah contoh dengan MyCursorLoader sebagai turunan dari CursorLoader , tempat Anda dapat melakukan koneksi ke database dan kueri.

Di onLoadFinished Anda harus memperlakukan kursor dengan hasil kueri.

Silakan, pertimbangkan tautan ke android.com, yang disebutkan di atas.

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 }
        );
    }

}

}

Cara lain, adalah dengan menggunakan ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html .

Dengan cara ini Anda dapat memisahkan lapisan data dan logika bisnis. Akses data Anda akan diabstraksikan ke uris.Menggunakan ContentProvider , Anda menentukan kueri Anda di dalamnya dan memuat data menggunakan Uri:

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

Ini adalah cara yang mudah jika Anda memiliki lebih dari satu atau dua pelanggan data Anda (Aktivitas atau Fragmen) - Anda hanya akan menggunakan uri yang telah ditentukan sebelumnya daripada mengulangi kueri sql atau membuat banyak CursorLoaders descendands .

Selain itu, ContentProvider dapat digunakan dari luar aplikasi Anda jika Anda mau.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android - Kursor diMapReady (Penanda)

  2. Bagaimana SQLite Ltrim() Bekerja

  3. Tidak dapat memuat database sqlite saat pertama kali dijalankan

  4. SQLITE tidak dapat memutakhirkan basis data hanya-baca dari versi 1 ke 2

  5. Urutan SQLite Berdasarkan Tanggal1530019888000