2012-01-09 115 views
15

我正在編寫一個Android應用程序,只要給定的SQLite數據庫發生更改(任何新行添加,刪除或更新),都需要通知它。Android SQLite數據庫通知

是否有任何編程方式來收聽這些通知?

是否爲每個表編寫DB觸發器的唯一方法?

+0

SQLLite數據庫操作僅適用於您的應用程序(或)可能來自任何地方? – kosa 2012-01-09 05:17:54

回答

5

SQLite提供了Data Change Notification Callbacks。我不認爲Android會直接公開它們,但它確實有例如CursorAdapter,它提供了一些更改通知。

但是,thinksteep問,你是否期望你的數據庫在你自己的應用程序範圍之外被改變?

+0

然而,正如thinksteep所問,你是否期望你的DB在你自己的應用程序範圍之外被改變?非常有用的通知 – 2012-12-28 15:24:01

+1

CursorAdapter提供了哪些更改通知? – 2014-09-28 06:45:32

+0

CursorAdapter的通知基於Android的東西,這些東西直接與數據庫更改無關。程序員在數據庫更改時通知該機制。 – 2018-02-21 15:58:24

1

每當你改變一些東西,你可以打電話cursor.registerDataSetObserver(..)註冊觀察變化,您可以註冊一個觀察者類如DataSetObserver

然後。

這不是有據可查的,但我敢肯定,有一些例子在那裏

+1

據我所知,遊標提供了數據的快照。這意味着除非您重新查詢數據,否則偵聽器將不會被調用。從文檔:「*註冊一個觀察者,當這個遊標數據集的內容發生變化時調用,例如,當通過調用(),deactivate()或close()。*更改數據集時, – 2014-09-28 06:19:27

+0

這會在程序員調用內容provider.notifyChange時觸發,並且不會自動檢測到更改。 – 2018-02-21 16:00:00

0

您可以使用也使用getContentResolver().registerContentObserver但不幸的是它不會告訴你什麼樣的變化作出,也可以是刪除,插入或更新。

如果您控制與數據庫接口的ContentProvider,那麼您可以觸發一個意圖或使用getContentResolver().notifyChange發送一個特殊的Uri通知來標識表和動作。你可以通過的一個例子Uri可能是:content://my-authority/change/table-name/insert

但即使這樣,你也不知道確切的哪些行受到變化的影響。

似乎觸發器寫入更改日誌表可以保證您聽到所有更改,而不管它們來自何處,並且您可以知道發生的確切ID和操作。不幸的是,它意味着更慢的插入/更新/刪除,這意味着您可能需要某種服務來處理和刪除更改。

我很想聽聽這些是否有更好的解決方案!