Android Retrofit получить ответ до следующего цикла курсора - PullRequest
0 голосов
/ 28 февраля 2019
@OnClick(R.id.btnCheckStockId) void callCheck() {

    MyDatabaseHelper dbHelper = new MyDatabaseHelper(ScanBarcodeActivity.this);
    final SQLiteDatabase sql = dbHelper.getWritableDatabase();

    String query = "SELECT barcode FROM stockopname where lokasi_item = ?";
    cursor = sql.rawQuery(query, new String[]{lokasiItem});

    try {

        while (cursor.moveToNext()) {

            final String stockId = cursor.getString(cursor.getColumnIndex("barcode"));
            //API RETROFIT
            ApiService api_check = ApiClient.getClient().create(ApiService.class);

            Call<String> call = api_check.check_barcode(stockId);

            call.enqueue(new Callback<String>() {

                @Override
                public void onResponse(Call<String> call, Response<String> response) {

                    //get result
                    String sync_result = response.body();
                    String set_sync = "";

                    if (sync_result == "true") {
                        set_sync = "true";
                    } else {
                        set_sync = "false";
                    }

                    //update data on sqlite
                    ContentValues updatecolumn = new ContentValues();
                    updatecolumn.put("is_sync", set_sync);
                    sql.update("stockopname", updatecolumn, "barcode = ?", new String[]{stockId});

                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
                }

            });

        }
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}

Таким образом, логика заключается в том, чтобы получить список из stock_id из локальной базы данных, а затем проверить сервер с API, если true, то stock_id уже существует на сервере, если false, данные stock_id еще не существуют.и результаты ответов необходимо обновить обратно в локальную базу данных с помощью столбца is_sync = true / false

при отладке указатель не входит в onResponse, но входит в следующий цикл

Я хочу спросить и нуждаюсь в совете о том, как получить ответ от сервера непосредственно перед следующим циклом в курсоре (используя базу данных sqlite), есть ли решение?

Обновление, Мое решение после восстановления кода:

    @OnClick(R.id.btnCheckStockId) void callCheck() {

    MyDatabaseHelper dbHelper = new MyDatabaseHelper(ScanBarcodeActivity.this);
    SQLiteDatabase sql = dbHelper.getWritableDatabase();
    String query = "SELECT barcode FROM stockopname where lokasi_item = ?";
    cursor_checksync = sql.rawQuery(query, new String[]{lokasiItem});

    if (cursor_checksync != null) {

        //more to the first row
        cursor_checksync.moveToFirst();

        //iterate over rows
        for (int i = 0; i < cursor_checksync.getCount(); i++) {

            callCheckSync(cursor_checksync);

            cursor_checksync.moveToNext();
        }
        //close the cursor
        cursor.close();
    }

}


public void callCheckSync(Cursor csr_checksync)
{

        final String stockId = csr_checksync.getString(csr_checksync.getColumnIndex("barcode"));
        //API RETROFIT
        ApiService api_check = ApiClient.getClient().create(ApiService.class);

        Call<String> call = api_check.check_barcode(stockId);

        call.enqueue(new Callback<String>() {

            @Override
            public void onResponse(Call<String> call, Response<String> response) {

                //get result

                if(response.isSuccessful())
                {
                    String sync_result = response.body();
                    String set_sync = "";

                    if (sync_result == "true") {
                        set_sync = "true";
                    } else {
                        set_sync = "false";
                    }
                    //update data on sqlite
                    update(stockId, set_sync);
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
            }

        });

    }


public void update(String Barcode, String value)
{
    MyDatabaseHelper dbHelper = new MyDatabaseHelper(ScanBarcodeActivity.this);
    SQLiteDatabase sql = dbHelper.getWritableDatabase();

    ContentValues updatecolumn = new ContentValues();
    updatecolumn.put("is_sync", value);
    sql.update("stockopname", updatecolumn, "barcode = ?", new String[]{Barcode});
}

Я не знаю, является ли это лучшим подходом, но это решает мою проблему.

1 Ответ

0 голосов
/ 28 февраля 2019

Вызвать этот метод на onClick после определения начального курсора.Извините за синтаксис, у меня нет IDE.

    public void callMethod(Cursor cursor){

        if (cursor.moveToNext()) {

            //Retrofit
            onResponse: () -> {
                callMethod(cursor);
            }
        }else {
            cursor.close();
        }
    }
...