Как использовать Viewmodel и LiveData с OrmLite DB и модифицировать - PullRequest
0 голосов
/ 02 марта 2019

Поскольку загрузчики были объявлены устаревшими с Android P (API 28), как указано здесь : загрузчики, я решил использовать ViewModel и LiveData в моем приложении, но, к сожалению, естьК счастью, я нашел этот пост blog , в котором говорится об этом.

используется OrmLite в MainActivity

ItemsDBHelper itemsDBHelper;
private static RuntimeExceptionDao<Item, Integer> runtimeExceptionDaoItems;

для хранения / кэширования данных. Я использовал AsyncTask следующим образом

static class SaveInDatabase extends AsyncTask<Item, Void, Void> {

    @Override
    protected Void doInBackground(Item... items) {
        List<Item> itemsList = Arrays.asList(items);
        runtimeExceptionDaoItems.create(itemsList);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // itemsDBHelper.close();
    }
}

и для извлечения:

runtimeExceptionDaoItems.queryForAll()

В настоящее время я использовал обратный вызов для модификации данных, чтобы получить данные с сервера, если есть соединение, и сохранить их в БД, чтобы при отсутствии соединения мы извлекали данные из базы данных

final Call<PostList> postList = BloggerAPI.getService().getPostList(url);
postList.enqueue(new Callback<PostList>() {
    @Override
    public void onResponse(@NonNull Call<PostList> call, @NonNull Response<PostList> response) {
        if (response.isSuccessful()) {
            progressBar.setVisibility(View.GONE);
            PostList list = response.body();
            if (list != null) {
                token = list.getNextPageToken();
                items.addAll(list.getItems());
                adapter.notifyDataSetChanged();

                SaveInDatabase task = new SaveInDatabase();
                Item[] listArr = items.toArray(new Item[0]);
                task.execute(listArr);
            }
        } else {
            progressBar.setVisibility(View.GONE);
            recyclerView.setVisibility(View.GONE);
            emptyView.setVisibility(View.VISIBLE);

            int sc = response.code();
            switch (sc) {
                case 400:
                    Log.e("Error 400", "Bad Request");
                    break;
                case 404:
                    Log.e("Error 404", "Not Found");
                    break;
                default:
                    Log.e("Error", "Generic Error");
            }
        }
    }

    @Override
    public void onFailure(@NonNull Call<PostList> call, @NonNull Throwable t) {
        Toast.makeText(MainActivity.this, "Error occured", Toast.LENGTH_LONG).show();
        Log.e(TAG, "onFailure: " + t.toString());
        Log.e(TAG, "onFailure: " + t.getCause());
    }
});

, в настоящее время я создаю ItemViewModelКласс и настроенный для приложения, как это:

public class ItemViewModel extends AndroidViewModel {

    private final String TAG = this.getClass().getName();

    private LiveData<List<Item>> listItems;

    public ItemViewModel(@NonNull Application application) {
        super(application);
    }

    public class ItemLiveData extends LiveData<List<Item>> {
        private final Context context;
        public ItemLiveData(Context context) {
            this.context = context;
            loadData();
        }

// Here data must be called either from the server (Retrofit) or from the database

        private void loadData() {
            new AsyncTask<Void,Void,List<Item>>() {
                @Override
                protected List<Item> doInBackground(Void... voids) {
                    List<Item> items = new ArrayList<>();
                    return  items;
                }

                @Override
                protected void onPostExecute(List<Item> items) {
                    super.onPostExecute(items);
                }
            }.execute();
        }
    }
}

и он используется следующим образом

ItemViewModel model =
        ViewModelProviders.of(this).get(Item.class);
    model.getData().observe(this, data -> {
      // update UI
    });

В предыдущем классе Какой метод я должен использовать для хранения данных в нем?

...