2016-07-17 3 views
1

У меня есть список просмотров в каждом действии в моем приложении. Для каждого getView() я создаю поток, чтобы открыть базу данных Sqlite и закрыть ее после (в каждом потоке). Но я получил ошибку блокировки базы данных.Когда закрыть базу данных Sqlite

Примечание: Приложение может иметь как 6 потоков, выполняющихся в то же время, используя каждый там собственный SQLiteOpenHelper

Так что, когда Android сказал, чтобы закрыть базу данных, когда не требуется, он говорит о закрытии, когда приложение в фоновом режиме или для каждого запроса с использованием транзакции или нет?

Код:

public class TemporarySqliteDB extends SQLiteOpenHelper{ 

    public TemporarySqliteDB(Context context) { 
    super(context, "Temporary", null, 1); 
    } 
    //.......... 
} 

public class DaoImage{ 
    private SQLiteDatabase writableDatabase; 

    public DaoImage(Context ctx) { 
    writableDatabase = new TemporarySqliteDB(ctx).getWritableDatabase(); 
    } 

    public void close() { 
    writableDatabase.close(); 
    } 
} 

В моей нити перспективе()

//this give locked error while instanciating 
DaoImage daoImage = null; 
      try { 
       daoImage = new DaoImage(ctx.get()); 

       //..... 
      }finally { 
       if(daoImage != null) 
        daoImage.close(); 
      } 

//This without error 
DaoImage daoImage = new DaoImage(ctx.get()); 
//.... 

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

ответ

1

Для обеспечения безопасности потоков SQLite для Android вы должны использовать тот же экземпляр класса SQliteOpenHelper. Как только вы это сделаете, закрытие баз данных после каждого использования, как вы делаете, правильно, и SQliteOpenHelper заботится о параллелизме.

Пример с помощью сделать ваш помощник синглтона:

public class TemporarySqliteDB extends SQLiteOpenHelper { 
    private static TemporarySqliteDB instance; 

    @synchronized public static getInstance(Context context) { 
    if (instance == null) { 
     instance = new TemporarySqliteDB(context.getApplicationContext()); 
    } 
    return instance; 
    } 

    // rest of class here 
} 

Тогда позже что-то вроде

SQLiteDatabase db = TemporarySqliteDB.getInstance().getWriteableDatabase(); 
try { 
    // use db 
} finally { 
    db.close(); 
} 

Что происходит с вашей текущей схемы использования является то, что вместо gainine SQLiteOpenHelper «s потокобезопасность вы» повторно используя безопасные защитные блоки SQLite для самого файла sqlite, которые пытаются предотвратить повреждение базы данных с одновременным доступом, который может быть от отдельных процессов.

+0

Это замечательно. вот что я искал. Но использование шаблона singleton позволяет вам закрывать и открывать БД один раз, потому что, пытаясь открыть БД, когда он уже закрыт, дайте это исключение: ** java.lang.IllegalStateException: попытка повторно открыть уже закрытый объект: SQLiteDatabase: * * – user3502626

Смежные вопросы