如何在Android中监听SQLite数据库的变化

12

我在安卓应用中使用SQLite数据库,希望能监听任何数据库变化。我该怎么做?

感谢您未来的所有帮助!


尝试:每当有东西被添加到数据库时发送广播并监听该广播。 - Anuranjit Maindola
在过去的一年里,有什么变化吗,也就是回答这个问题之后?到目前为止,安卓还是没有自动触发或回调任何东西吗? - Shirish Herwade
现在我们不能使用RxJava将Sqlite变为可观测吗? - Nitin Sethi
4个回答

10

2

SQLite并不提供任何更改监听器功能,您需要自行监视。最简单的方法是在每次修改数据库时发送广播(或者更好的是本地广播)。一些数据库库已经提供了类似此功能的功能-请查看GreenDAO


我读完这个答案后感到震惊。但是我想知道,在过去的一年里是否有任何变化,也就是在回答这个问题之后。 - Shirish Herwade
不,SQLite在这方面保持不变。如果它曾经包含了这个功能,我会感到惊讶;因为它的名字就暗示着它是一个“轻量级”的SQL数据库。它的功能只是存储,没有更多的东西。 - tophyr
4
事实上,SQLite本身提供了这种功能。问题在于,android.database.sqlite.SQLiteDatabase并没有提供该功能。 - Mooing Duck

0

你好,我想在使用 Firebase 时提出一个新的建议。你可以为用户消息创建一个新的 JSON 节点,并使用 On Data Change 来检测未读消息的数量,然后在 onDatachange 中更新你的 UI。这个建议是否明智,或者偏离了主要思路?


0

Android数据库ChangeListener的简单实现

假设您在Android应用程序中有一个处理查询的类,我们需要使数据库方法成为可观察对象。同时,我们需要一些监听器来观察上述可观察对象。让我们将数据库处理程序设置为可观察对象

让我们创建可观察接口:

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();

}

现在在你的数据库类中实现可观察者

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);
}

然后我们需要一个 观察者观察 这些变化:

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
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接