#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: Я пропустил несколько проверок границ, но надеюсь, что вы поняли общую идею.