Android SQLite: база данных пуста во втором действии - PullRequest
0 голосов
/ 07 июля 2011

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

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

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

Вот пример кода:

    SQLiteDatabase db = getWritableDatabase(); // get instance of current database 

    db.beginTransaction(); // set exclusive mode to speed up

    for(GulbArticle g : gulbArticles){
        this.insert(g);
    }

    db.setTransactionSuccessful();
    // counting here returns 315 rows using the all2() function below
    db.close();
    // counting here returns 0 rows using the all2() function below

Вот функция, которую я сделал, чтобы вернуть счет

public void all2(){
      SQLiteDatabase db = getReadableDatabase();
      String sql = "SELECT COUNT(*) FROM "+TABLE_NAME;
      SQLiteStatement statement =db.compileStatement(sql);
        long count = statement.simpleQueryForLong();
        Log.v("ccount2",count+"");
}

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

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Кажется, вы забыли позвонить db.endTransaction();, то есть совершить транзакцию. Следует читать:

db.setTransactionSuccessful();
db.endTransaction();
db.close();

Также хорошая идея заключить его в try-catch-finaly так:

try {
    db.beginTransaction();
    // do your DB manipulation
    db.setTransactionSuccessful();
} catch(...) { 
    ...
} finally {
    db.endTransaction();
}

db.close();
1 голос
/ 07 июля 2011

Вам не нужно закрывать базу данных при запуске второго действия.SQLite - это обычная система управления БД, что означает, что подобные ситуации должны быть разрешены.

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

В вашем случае я считаю, что вы должны использовать неэксклюзивные транзакции - т.е. когда запись заблокирована в эксклюзивном режиме - запись в недоступном, поэтому базовая идиома должна выглядеть следующим образом:

db.beginTransactionNonExclusive();   
try 
{     
   // do smth     
   db.setTransactionSuccessful();   
} 
finally 
{     
   db.endTransaction();   
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...