Sqlite3 в iPhone выдает исключение, заблокированное базой данных

#iphone #sqlite

#iPhone #sqlite

Вопрос:

Я новичок в iphone и sqlite и делаю несколько уроков.

Я создал один метод, который сохраняет некоторую информацию о характере в моей базе данных.

Теперь, когда я нахожусь на контроллере FirstView моего приложения, я дважды вызвал этот метод. Он сохраняет данные дважды в конкретной таблице. Теперь я перешел к SecondViewController, и там у меня есть новый объект sqlite3 в файле заголовка, и я снова копирую и вставляю этот метод в SecondViewController. Теперь, когда я вызываю этот метод на втором ViewController, он выдает следующую ошибку:

  Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error while inserting data. 'database is locked''    
  

мой код:

 -(void)storeTemp
  

{

 SchoolFocusIPadAppDelegate *delegate = (SchoolFocusIPadAppDelegate *)[[UIApplication sharedApplication] delegate];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"sfocusDB.sqlite"];
if(sqlite3_open([path UTF8String], amp;databases) == SQLITE_OK){

    //const char *sql = "select * from animal";
    const char *sql = "insert into groups(id, groupid, name, desc , createdon,createdby) Values(?,?,?,?,?,?)";

    sqlite3_stmt *add;
    if(sqlite3_prepare_v2(databases, sql, -1, amp;add, NULL) == SQLITE_OK){
        NSLog(@"Connection Successful");
        NSLog(@"***Storing START on Database ***");
        sqlite3_bind_text(add, 2, [[NSString  stringWithFormat:@"Temp Group Dont Open"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(add, 3, [[NSString  stringWithFormat:@"kjhasd"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(add, 4, [[NSString  stringWithFormat:@"asdas"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(add, 5, [[NSString  stringWithFormat:@"asdsa"] UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(add, 6, [[NSString  stringWithFormat:@""] UTF8String], -1, SQLITE_TRANSIENT);
        NSLog(@"***Storing END on Database ***");
        if(SQLITE_DONE != sqlite3_step(add))
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(databases));
        else {
            NSLog(@"YES THE DATA HAS BEEN WRITTEN SUCCESSFULLY");
        }
    }
  sqlite3_finalize(add);
}
sqlite3_close(databases);
}
  

Пожалуйста, помогите мне, друзья. Я действительно застрял.

Большое спасибо

Ответ №1:

 here lots of chances to kill 
1.if your id is not null in DB it will kill with constraint failed error

if you don't want to insert any value to id remove from list 
like
const char *sql = "insert into groups( groupid, name, desc , createdon,createdby) Values(?,?,?,?,?)";
  

и измените это число 1-5 вместо 2-6

Комментарии:

1. id — это первичный ключ и значение автоматического увеличения. Вот почему я не добавляю его значение. и я попытался, удалив идентификатор из запроса вставки, но все равно возникает эта ошибка .. 🙁

2. вы изменили 2-6 чисел на 1-5

3. после отладки с точкой останова после этого скажите мне, на каком заявлении app kill

4. он фактически выполняет все sqlite_bind_text statments, но когда он появляется на sqlite_step, он не выдает SQLITE_DONE, поэтому он переходит к inside if и показывает сообщение об ошибке утверждения. за исключением, которое я вставил в свой вопрос

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

Ответ №2:

У меня были некоторые проблемы с sqlite3_close после if / else (не уверен, почему), но когда я также помещаю вызовы finalize и close внутри if, это сработает. Я начал следить за каждым открытием и закрытием с помощью одного и того же NSLog (пронумерованного, чтобы я знал, какой из них какой), и затем вы можете увидеть, какой шаг оставил БД открытой (и, следовательно, заблокированной)

Комментарии:

1.черт возьми, это была моя ошибка…. Я забыл закрыть базу данных одним из своих методов.. когда я следую каждому методу, который взаимодействует с моей базой данных, я обнаружил это.. Спасибо за совет. 🙂

Ответ №3:

Вы скопировали базу данных в доступный для записи документ-каталог?

Ваш prepare-call нуждается в небольшом изменении:

От if(sqlite3_prepare_v2(databases, sql, -1, amp;add, NULL) == SQLITE_OK){

Для if(sqlite3_prepare_v2(databases, [sql UTF8String], -1, amp;add, NULL) == SQLITE_OK){

(но это не причина database locked ).