Как сохранить извлеченные данные из Firebase, когда приложение убито? - PullRequest
0 голосов
/ 17 января 2019

Мое приложение получает данные, как это. Я хочу сохранить извлеченные данные из firebase, если приложение убито, и использовать при повторном создании приложения, поэтому я хочу извлекать данные только при изменении базы данных, но не onViewCreated. Я думаю, что я должен использовать комнату базы данных. Сначала извлеките данные в базу данных комнаты, затем покажите данные из базы данных комнаты. Если пользователь вводит новые данные, прослушиватель события value будет работать и снова получать данные в базу данных помещения. Это хороший способ? если нет, то есть ли хороший способ сделать это?

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    this.v = view;
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);

    final RecyclerView productListView = v.findViewById(R.id.productList);

    final ProgressBar mProgresBar = v.findViewById(R.id.inventoryProgressBar);

    getDatabase();

    fetchProductsToRecyclerList(getContext(),productListView,mProgresBar);}

Например, я использую прослушиватель события value и хочу, чтобы приложение получало данные только с прослушивателями этого события.

public void fetchProductsToRecyclerList(final Context context, final RecyclerView rv,
                                               final ProgressBar pb) {
    DatabaseReference myRef = getFirebaseRef();
    String userID = getUserId();
    myRef.child(userID).child("Products").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            products = new ArrayList<>();
            pb.setVisibility(View.VISIBLE);
            int counter = 0;
            //Get all of the children at this level
            Iterable<DataSnapshot> children = dataSnapshot.getChildren();
            for (DataSnapshot child : children) {
                Iterable<DataSnapshot> cocuklar = child.getChildren();
                for (DataSnapshot cocuk : cocuklar) {
                    counter += 1;
                    Product prd = cocuk.getValue(Product.class);
                    if (!prd.getProductID().equals("0x0x00x0xx"))
                        products.add(prd);

                }
            }
            mAdapter = new ProductAdapter(context, products);

            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
            DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(rv.getContext(),
                    ((LinearLayoutManager) layoutManager).getOrientation());
            rv.addItemDecoration(dividerItemDecoration);
            rv.setHasFixedSize(true);
            rv.setLayoutManager(layoutManager);
            rv.setItemAnimator(new DefaultItemAnimator());
            rv.setAdapter(mAdapter);
            if (counter == 0) {
                //    emptyList.setVisibility(View.VISIBLE);
            } else {
                //    emptyList.setVisibility(View.INVISIBLE);
            }
            pb.setVisibility(View.INVISIBLE);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

1 Ответ

0 голосов
/ 17 января 2019

Любые данные, которые вы запрашиваете с помощью Realtime Database SDK, будут кэшироваться в локальном хранилище по умолчанию.Кеш будет использоваться для последующих запросов, если данные обновляются сервером.Вам не нужно ничего делать, чтобы включить это.Вам не нужен дополнительный кэш, если только вам не нужно запрашивать данные каким-либо образом, отличным от того, что предлагает SDK.

Подробнее о сохранении диска см. В документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...