Android NSFetchedResultsController

#android #nsfetchedresultscontroller #ormlite

#Android #контроллер nsfetchedresultscontroller #ормлит #nsfetchedresultscontroller #ormlite

Вопрос:

У меня есть iPhone и приложение для Android. На iPhone я использую NSFetchedResultsController для управления данными, которые у меня есть для своих UITableView . В настоящее время у меня много данных (несколько тысяч строк).

В моем приложении для Android, которое я использую ORMLite , я сохраняю данные в таблицу, но когда я извлекаю, я извлекаю все данные в массив и использую ArrayAdapters . Есть ли более эффективный способ сделать это, такой как NSFetchedResultsController тип object? Я хочу загружать только необходимые объекты, а не все из них по соображениям производительности.

Есть ли способ сделать это внутри ORMLite ? Я пытался найти в документации, но пока ничего не нашел… Есть ли что-нибудь еще, чего мне не хватает, что могло бы помочь здесь?

Ответ №1:

Вы могли бы использовать CursorAdapter.

Смотрите http://developer.android.com/reference/android/widget/CursorAdapter.html и http://www.mysamplecode.com/2012/07/android-listview-cursoradapter-sqlite.html

или вы могли бы реализовать бесконечный адаптер

Здесь может помочьотложенная загрузка. Предположим, у вас есть данные из 10000 записей. Вы могли бы отображать конечное подмножество из этого, скажем, 90 записей одновременно.Вы могли бы изначально загрузить несколько записей, скажем, 30 (1-30). При прокрутке до конца вы загружаете еще 30 записей.Как только количество загруженных записей достигнет 90 (при третьей загрузке), вы можете сократить текущий набор данных до 31-120 вместо предыдущих 1-90.

То же самое происходит и в другую сторону, т. Е. При прокрутке вверх.

 int offset=0;
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
     final int MAX_SUBSET=90;
     final int INTERVAL=30;
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {

        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            final int lastItem = firstVisibleItem   visibleItemCount;

            if(lastItem == totalItemCount) {
                //Load new data and update The adapter.
                  if(totalItemCount<=MAX_SUBSET){
                      loadData(0,totalItemCount INTERVAL);
                  }
                  else{
                   offset =INTERVAL;
                  loadData(offset,MAX_SUBSET);

                   }
            }
            else if(0==firstVisibleItem){
              //Load old data
                if(totalItemCount<=MAX_SUBSET){
                      loadData(0,totalItemCount INTERVAL);
                  }
                  else{
                   offset-=INTERVAL;
                       loadData(offset,MAX_SUBSET);

                   }
            }
    });
  

PS: Я пропустил несколько проверок границ, но надеюсь, что вы поняли общую идею.