Sqlite3 в iPhone дает исключение для заблокированной базы данных - PullRequest
0 голосов
/ 05 октября 2011

Я новичок в 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], &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, &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);
}

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

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

Ответы [ 3 ]

3 голосов
/ 05 октября 2011
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

0 голосов
/ 05 октября 2011

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

Ваш подготовительный звонок нуждается в небольшом изменении:

С if(sqlite3_prepare_v2(databases, sql, -1, &add, NULL) == SQLITE_OK){

До if(sqlite3_prepare_v2(databases, [sql UTF8String], -1, &add, NULL) == SQLITE_OK){

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

0 голосов
/ 05 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...