2014-01-18 6 views
2

Я работаю над проектом с sqlite. В моем проекте я вставляю, получаю и обновляю данные в datbase. Но несколько раз я берусь за ошибку в базе данных, заблокирован и нет такой таблицы: tablename. Я проверил в своем коде sqlite3_open, sqlite3_prepare_v2, sqlite3_step, sqlite3_finalize и sqlite3_close. Но я получаю проблему. Может ли кто-нибудь помочь мне с этимбаза данных заблокирована error sqlite Ios

ответ

2

Этот код ошибки возникает, когда вы пытаетесь одновременно выполнить две несовместимые вещи с базой данных из того же соединения с базой данных. Например, если вы находитесь в середине инструкции SELECT, и вы пытаетесь DROP одной из таблиц, прочитанных SELECT, вы получите ошибку SQLITE_LOCKED. Ниже приведен пример (с использованием Tcl):

db eval {SELECT rowid FROM ex1} { 
    if {$rowid==10} { 
    db eval {DROP TABLE ex1} ;# will give SQLITE_LOCKED error 
    } 
} 

Обратите внимание, что ошибка SQLITE_LOCKED отличается от SQLITE_BUSY (5). SQLITE_BUSY означает, что другое соединение с базой данных (возможно, в другом процессе) использует базу данных таким образом, чтобы это не позволяло вам ее использовать. SQLITE_LOCKED означает, что источник конфликтов является внутренним и происходит из того же соединения с базой данных, которое получило ошибку SQLITE_LOCKED.

Вот другие причины получать SQLITE_LOCKED ошибку:

  1. пытается создать или удалить таблицу или индекс в то время как SELECT, утверждение еще не завершено.

    • Иногда люди думают, что они закончили с ЗЕЬЕСТОМ потому sqlite3_step() вернул SQLITE_DONE. Но SELECT действительно не заполнен до тех пор, пока не будут вызваны sqlite3_reset() или sqlite3_finalize(). .

    • С регистрацией [3902] (2007-05-02 после версии 3.3.17) это теперь разрешено для оператора CREATE.

  2. Попытка записи в таблице в то время как SELECT, активен на том же таблице.

    • С регистрацией заезда [3355] (2006-08-16 после версии 3.3.7) это сейчас разрешено.
  3. Попытка сделать два ВЫБРАТЬ на одной и той же таблицы, в то же время в
    многопоточного приложения, если SQLite не установлен, чтобы сделать это.

  4. Fcntl (3, F_SETLK вызов на файл базы данных не выполняется. Это может быть вызвано блокировкой выпуском
    NFS, например. Одно из решений этой проблемы, является мв БД прочь, и скопировать его обратно так что он имеет новое значение Inode
    .

+0

у вас есть какое-либо решение этой ссылки problem.All приветствуются. – chakshu

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