开发者

Sqlite3 in iPhone gives Database Locked Exception

开发者 https://www.devze.com 2023-04-10 14:37 出处:网络
I am newbiee in iphone and sqlite and doing some tutorials. I have created one method which stores some temperory informartion into my database.

I am newbiee in iphone and sqlite and doing some tutorials.

I have created one method which stores some temperory informartion into my database.

Now when i am on firstView controller of my Application i called that method twice. It stores the data twice into the particular table. Now i went to SecondViewController and in there i have a new sqlite3 object in the header file and i again copy paste that method into the SecondViewController. Now when i call that method on Second ViewController it gives me following error:

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

my Code is:

-(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);
}

Please Help me friends. M really stucked.

Thanks alot


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(?,?,?,?,?)";

and change that number 1-5 instead of 2-6


I've had some problems with sqlite3_close following an if/else (not sure why) but when I also put the finalize and close calls inside the if, it'd work out. I started following every open and close with an NSLog of the same (numbered so I knew which one was which) and you can then see which step left the DB open (and therefore locked)


Have you copied the database to the writable doc-dir?

Your prepare-call needs a little change:

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

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

(but that's nit the reason for the database locked).

0

精彩评论

暂无评论...
验证码 换一张
取 消