2

Я разрабатываю приложение, которое зависит от базы данных (локальной) - и эта база данных часто обновляется.Частое обновление SQLite DB и Listview (эффективность)

Я пытаюсь достичь: Предположим, что данные показаны в виде списка. Я хочу, чтобы listview обновлял набор данных , как только происходит любое изменение в базе данных (или конкретная таблица, если быть точным).

До сих пор я думал, что один из этих вариантов: класс

  1. SQLiteOpenHelper: всякий раз, когда обновление/вставка делается это оповестит деятельность обновить ListView через BroadcastReceiver.
  2. ContentProvider с CursorLoader (не использовал его раньше, так немного скептически)
  3. Что-то еще? Пожалуйста, предложите.

Каков наилучший способ обеспечить последовательные и немедленные обновления без блокировки пользовательского интерфейса (производительности)?

+2

опция no 2 является вашим другом – pskink

+1

Используйте CursorLoader. Вам необязательно нужен ContentProvider, вы можете написать свой собственный CursorLoader, который запрашивает вашу базу данных напрямую, вместо использования ContentResolver – Karakuri

+0

Спасибо! Наконец, устроился с помощью пользовательского CursorLoader. Поделитесь решением ... – TheKalpit

ответ

1

Как предложил @Karakuri создал пользовательский CursorLoader, расширив класс CursorLoader без ContentProvider.

Вот решение:

CustomCursorLoader.class

public class CustomCursorLoader extends CursorLoader { 

    private final ForceLoadContentObserver forceLoadContentObserver = new ForceLoadContentObserver(); 

    public CustomCursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     super(context, uri, projection, selection, selectionArgs, sortOrder); 
    } 

    @Override 
    public Cursor loadInBackground() { 
     Cursor cursor = /* get cursor from DBHandler class */; 
     cursor.setNotificationUri(getContext().getContentResolver(), CONTENT_URI); 

     if (cursor != null) { 
      cursor.getCount(); 
      cursor.registerContentObserver(forceLoadContentObserver); 
     } 
     return cursor; 
    } 

} 

Каждый раз, когда вы вносите изменения в БД, сделайте следующее:

getContentResolver().notifyChange(CONTENT_URI, null); 

В классе активность:

реализует интерфейс LoaderManager.LoaderCallbacks<Cursor>

инициируют ПОГРУЗЧИК getLoaderManager().initLoader(0, null, this);

и заместить эти методы:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CustomCursorLoader(this, CONTENT_URI, null, null, null, null); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    customCursorLoaderAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    customCursorLoaderAdapter.swapCursor(null); 
} 

расширить CursorAdapter класс для создания ListView адаптера и вы сделали.

+1

Каков был тип импорта вашего CONTENT_URI здесь? –

+0

Заметьте, мне пришлось использовать getSupportLoaderManager(). InitLoader (0, null, this); – marienke

0

Если производительность имеет решающее значение для вашего приложения, вы должны взглянуть на базу данных Realm for Android. Он обеспечивает лучшую эффективность, чем SQLite, и вы можете использовать RealmChangeListener для прослушивания изменений в базе данных.