7

İlk yaklaşımı kullanarak Google IO presentation mimarisine dayanan bir uygulama geliştiriyorum. Temelde SQLite DB tarafından desteklenen bir Service, ContentProvider var ve ben de Loader s kullanın.Veritabanı değişikliği meydana geldikten sonra kullanıcı arayüzünü güncellemenin yolu

Veritabanımdaki değişiklikler gerçekleştiğinde kullanıcı arayüzünü güncellemenin bir yoluna ihtiyacım var. Örneğin, bir kullanıcı kendi sepetine bir öğe eklemek isteyebilir. Öğe kimliğini sepet tablosuna ekledikten sonra, kullanıcı arayüzünü güncellemek istiyorum. Hangi yaklaşımı kullanmalıyım? Şu ana kadar ContentObserver hakkında çok az bilgi gördüm. Gitmenin yolu mu?

+0

Sepet içindeki ürün, veritabanındaki * insert * işlemi ile birleştirilmiştir? – Blackbelt

+0

Ne demek istediğinizden tam olarak emin değilim ama temelde, http isteği tamamlandıktan sonra, veritabanı tablosunda karşılık gelen satırı güncelleyin, bu durum bir şekilde UI tarafından yansıtılmalıdır. Benim sorunum, DB verisi değiştirildikten sonra UI'nin güncellenmesi gerektiğini söyleyemem. Satırı güncelleştirdikten sonra – midnight

+0

callifyChange'ı çağırdınız mı? – Blackbelt

cevap

6

senin ContentProvider döndü imleç için bir dinleyici ekleyin:

sizin insert/ update/ delete yöntemlerinde Sonra
Cursor cursor = queryBuilder.query(dbConnection, projection, selection, selectionArgs, null, null, sortOrder); 
cursor.setNotificationUri(getContext().getContentResolver(), uri); 

böyle kodu kullanın:

final long objectId = dbConnection.insertOrThrow(ObjectTable.TABLE_NAME, null, values); 
final Uri newObjectUri = ContentUris.withAppendedId(OBJECT_CONTENT_URI, objectId); 
getContext().getContentResolver().notifyChange(newObjectUri , null); 

Sizin CursorLoader olacak haberdar olun ve OnLoadFinished(Loader, Cursor) tekrar çağrılacaktır.

Bir Loader kullanmıyorsanız, ContentObserver Eğer db değişiklikleri bildirilir kod birkaç satır ile, gitmek yoludur (ama elle yeniden sorgulamak gerekir).

private ContentObserver objectObserver = new ContentObserver(new Handler()) { 
    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     restartObjectLoader(); 
    } 
}; 

onResume() yılında aramayı unutmayın:

getContentResolver().registerContentObserver(ObjectProvider.OBJECT_CONTENT_URI, false, objectObserver); 

ve onPause() yılında:

getContentResolver().unregisterContentObserver(objectObserver); 

Güncelleme: UI Değişiklikler Bu daha büyük bir konudur bu Adapter size bağlıdır çünkü ListView veya'ü doldurmak için kullanın.

CursorAdapter olarak onLoadFinished(Loader loader, Cursor data)

mAdapter.swapCursor(data); 

ArrayAdapter onLoadFinished(Loader loader, Cursor data)olarak RecyclerView.Adapter

Object[] objects = transformCursorToArray(data); //you need to write this method 
mAdapter.setObjects(objects); //You need to wrie this method in your implementation on the adapter 
mAdapter.notifyDataSetChange(); 

onLoadFinished(Loader loader, Cursor data) olarak

Object[] objects = transformCursorToArray(data); //you need to write this method //Here you have more mAdapter.notify....() 
RecyclerView.Adapter bildirmek için farklı bir yol from here okuyun.

2

Bir liste kullanıyorsanız, bağdaştırıcıyı tekrar doldurabilir ve listenize ekleyebilirsiniz. Veya veri seti değişikliğini bildirmeye çalışın. arasında query yöntemde