База данных заблокирована исключение

Я создал базу данных в моем приложении с 5 таблицами. моя база обновляется из разных тем. Когда я вижу журнал, я вижу, что есть исключение заблокированной базы данных при открытии базы данных, если она уже открыта.

Один из моих друзей предложил мне всегда использовать контент-провайдера, чтобы избежать этой проблемы. По его словам, контент-провайдер самостоятельно решает проблемы параллелизма?

Рекомендуется ли использовать контент-провайдера, если мы не хотим делиться данными с другими приложениями?

Ответы на вопрос(2)

что использование блокировки чтения-записи достаточно в большинстве случаев.

Предположим, вы написали следующее,

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MyDatabase extends SQLiteOpenHelper
{
    private static final ReadWriteLock rwLock = new ReentrantReadWriteLock(true);

    private static void beginReadLock()
    {
        rwLock.readLock().lock();
    }

    private static void endReadLock()
    {
        rwLock.readLock().unlock();
    }

    private static void beginWriteLock()
    {
        rwLock.writeLock().lock();
    }

    private static void endWriteLock()
    {
        rwLock.writeLock().unlock();
    }

тогда вы можете выполнить свою задачу следующим образом.

    public static void doSomething()
    {
        SQLiteDatabase sldb = null;

        try
        {
            beginReadLock();

            MyDatabase mydb = new MyDatabase();
            sldb = mldb.getReadableDatabase();
            ......
        }
        catch (Exception e)
        {
            ......
        }
        finally
        {
            if (sldb != null)
            {
                try
                {
                    sldb.close();
                }
                catch (Exception e) {}
            }

            endReadLock();
        }
    }

Заключить операции чтения сbeginReadLock() а такжеendReadLock(), Аналогично, приложите операции записи сbeginWriteLock() а такжеendWriteLock().

Несколько месяцев назад, с помощью решения, описанного выше, я мог решить мою собственную проблему с блокировкой базы данных, когда несколько потоков пытались одновременно читать / писать-открывать базу данных.

 30 сент. 2015 г., 14:52
Должно быть сделано на том же объекте класса databaseHelper
 22 сент. 2015 г., 09:05
Эй @ Такахико Кавасаки: Я попробовал ваше решение, но я все еще сталкиваюсь с проблемой. Не уверен, что может пойти не так.

что вы используете несколько соединений с базой данных. Таким образом, несколько потоков пытаются обновить вашу таблицу одновременно, и все эти потоки имеют разные подключения к вашей базе данных.

Чтобы избежать этой проблемы во всех ваших потоках, вам нужно использовать одно и то же соединение с базой данных, то есть все ваши потоки должны использовать одно и то же соединение с базой данных (которое представлено объектом SQLiteDabase).

Более того, поскольку в файле sqlite имеется файловый блок, вы не улучшите производительность обновления базы данных с использованием нескольких потоков (для работы с базой данных лучше использовать только один поток). Если вы хотите использовать несколько потоков, вы должны использовать одно и то же соединение с базой данных, и в этом случае Android будет управлять блокировками.

Обсуждение этой проблемы вы можете найти здесь:http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking и здесь:Каковы лучшие практики для SQLite на Android?

Ваш ответ на вопрос