android - SQLite中的多线程数据写入

标签 android multithreading sqlite

当我尝试使用我的 SQLite 数据库建立多线程工作时,我有点困惑,所以我有一个服务定期从服务器加载数据并将其插入到不同的数据库表中,而且任何用户在任何时间都可以存储当在应用程序窗口中按下“保存按钮”时,他自己的数据在数据库中,因此根据一次只有一个线程可以在数据库中写入数据的规则,我想进行线程合作。首先,我创建了一个只有一个数据库实例的单例,并且我的 read-db 方法一切都很好,因为所有线程都可以同时读取数据,但是写入呢?我在写入函数中使用一个线程,并且在前一个线程完成工作之前不会启动另一个线程。(当用户按下保存按钮时,我也会对来自 ui 线程的调用执行此操作)

问题:我想做的就是考虑两种情况 - 第一种是当线程调用相同的函数来写入数据时,然后我使用同步,第二种 - 当线程调用不同的写入函数时我应该使用锁, 正确的?所以现在我做出了决定,但这样做是否正确、正确呢?

代码(已更新):

// Sync method for processing 1st situation
public synchronized void addPoints(final ArrayList<Point> points, final OnDBOperationListener listener) {
    if (listener != null) {
        // Lock for others write-threads in 2nd situaton
        synchronized (mWriteLock) {
            while (mWriteWait) {
                try {
                    mWriteLock.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            mWriteWait = true;

                    try {
                        SQLiteDatabase db = getDatabase();
                        // write a data

                        listener.onSuccess();
                    } catch (Exception e) {
                        e.printStackTrace();
                        listener.onError();
                    } finally {
                        closeDatabase();
                        synchronized (mWriteLock) {
                            mWriteWait = false;
                            mWriteLock.notifyAll();
                        }
                    }

        }

    }
}

最佳答案

经过长时间的搜索,我终于找到了我的问题的一个很好的答案,所以任何想要创建对数据库的多线程访问的人都应该首先阅读这篇文章 What are the best practices for SQLite on Android?

关于android - SQLite中的多线程数据写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438835/

相关文章:

Android - 完全删除手机后正在恢复应用程序数据库

android - 如何在 Android 自定义 Canvas 中绘制圆形?

sql - iOS SQLite 搜索。速度问题

ruby-on-rails - 如何从heroku备份sqlite3

java - 在 Android SQLite 表中返回 Count(*)

java - 使用 HttpURLConnection 发送 UTF-8 字符串

android - 如果 Android NDK 应用程序加载多个共享的 C++ STL 实现,会有什么行为?

c++ - 当应用程序在没有适当的 wait() 调用的情况下关闭时 QThread 会发生什么?

java - 我可以使用线程在 JavaFX 中设置标签文本吗?

并发队列推送函数的 C++ 返回值