SQLite
 sql >> база данни >  >> RDS >> SQLite

Как да стартирате SQLite заявка асинхронно във фонова нишка?

Вероятно този https://developer.android.com/reference/android/app/LoaderManager.html ще ви помогне.

Освен това, ето кратка реализация за вас, но това не е RxJava.

Първо, трябва да внедрите LoaderManager.LoaderCallbacks<Cursor> , и обикновено този интерфейс се реализира от Activity (или Fragment).

В onCreateLoader , CursorLoader трябва да бъде създаден и върнат. Ето само пример с MyCursorLoader като потомък на CursorLoader , където можете да извършвате свързване с база данни и заявки.

В onLoadFinished трябва да третирате курсора с резултатите от заявката.

Моля, обърнете внимание на споменатата по-горе връзка към android.com.

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

}

}

Друг начин е използването на ContentProvider https://developer.android.com/guide/topics/providers/content-providers.html .

По този начин можете да разделите слоя данни и бизнес логиката. Вашият достъп до данни ще бъде абстрахиран до uris. Използване на ContentProvider , дефинирате заявките си в него и зареждате данни с помощта на Uri:

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

Това е удобен начин, ако имате повече от един или двама клиенти на вашите данни (дейности или фрагменти) - ще използвате само предварително дефинирани uris адреси, вместо да повтаряте sql заявки или да създавате много CursorLoaders descendands .

Освен това ContentProvider може да се използва извън приложението ви, ако желаете.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да съхранявате sqlite база данни директно на sdcard

  2. Не може да се обвърже аргумент в индекс 2, защото индексът е извън обхвата

  3. пагинация в списъка

  4. SQLite ПОКАЖЕ ТАБЛИЦИ Еквивалент

  5. Ще се влоши ли производителността на SQLite, ако размерът на базата данни е по-голям от 2 гигабайта?