簡體   English   中英

如何在android中監聽SQLite數據庫的變化

[英]how to listen for SQLite database changes in android

我在 android 中使用 SQLite 數據庫並想監聽任何數據庫更改。 我怎樣才能做到這一點?

感謝所有未來的幫助!

事實上,SQLite 提供了這樣的功能: SQLite Data Change Notification Callbacks

不過,如何在 Android 中使用它是另一回事。

SQLite 不提供任何更改監聽器功能; 你必須自己監控它。 實現此目的的最簡單方法是在您修改數據庫時發送廣播(甚至更好,本地廣播)。 一些數據庫庫已經提供了與此類似的功能 - 查看GreenDAO

Android上數據庫的changeListener的簡單實現

假設您有一個類來處理您的 android 應用程序中的查詢,我們需要使數據庫方法可觀察 而且我們還需要一些聽眾來觀察上述可觀察的。 讓我們讓數據庫處理程序observable

讓我們制作可觀察的界面:

public interface DatabaseObservable {
    //register the observer with this method
    void registerDbObserver(DatabaseObserver databaseObserver);
    //unregister the observer with this method
    void removeDbObserver(DatabaseObserver databaseObserver);
    //call this method upon database change
    void notifyDbChanged();

}

現在在你的數據庫類中implement observable

public class LocalStorageDb extends SQLiteOpenHelper implements DatabaseObservable {
LocalStorageDb lDb;

//make it Singleton
public static synchronized LocalStorageDB getInstance(Context context) {
    if (mlLocalQuickChatDB == null) {
        mlLocalQuickChatDB = new LocalStorageDB(context.getApplicationContext());
    }
    return mlLocalQuickChatDB;
}

//there are some methods to do some queries
    public void createContact(Foo foo, Bar bar){

//some queries here

//call the Observable Method to let know the observers that it has changed
onDatabaseChanged();
}

//now override the DatabaseObservable method which is responsible to notify the listeners
@Override
public void onDatabaseChanged() {
    for (DatabaseObserver databaseObserver:observerArrayList){
if (databaseObserver!= null){
    databaseObserver.onDatabaseChanged();
    }}
}
//also you need functions to **register** or **unregister** the observers:
 @Override
public void registerDbObserver(DatabaseObserver databaseObserver) {
    if (!observerArrayList.contains(databaseObserver)){
        observerArrayList.add(databaseObserver);
    }

@Override
public void removeDbObserver(DatabaseObserver databaseObserver) {
    observerArrayList.remove(databaseObserver);
}

那么我們需要一個observer觀察變化:

public interface DatabaseObserver {
void onDatabaseChanged();
}

現在在您的活動或片段中,有一個獲取更改的函數,例如getLocalContact 在片段上實現觀察者,例如:

public class ExampleFragment extends Fragment implements DatabaseObserver {

LocalStorageDB localStorageDB;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    localStorageDB = LocalStorageDB.getInstance();
}

@Override
public void onPause() {
    super.onPause();
    localStorageDB.removeObserver(this);

}


@Override
public void onResume() {
    localStorageDB.registerObserver(this);
    super.onResume();
}

public ExampleFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_example, container, false);
}

@Override
public void onDatabaseChanged() {
getLocalContact();
}

private void getLocalContact(){
    //function to fetch contacts from database
}
}

嗨,我想添加一個新的建議,以防使用 firebase。 您可以為用戶消息創建一個新的 json 節點,並使用 On Data Change 來檢測新的未讀消息數量,然后在 onDatachange 中更新您的 ui。 這是聰明的還是遠離主要思想?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM