Search code examples
objective-cfmdb

FMDatabase database locked


So, I created an app that stores some data. However, every time, after I've called the delete function I wrote, and then call a different function, I get an error saying database locked.

This is the function:

+ (void)deleteRestaurants:(NSString *)number {
    FMDatabase *database = [sDatabase openUp];

    [database open];

    FMResultSet *rs = [database executeQuery:[NSString stringWithFormat:@"SELECT * FROM restaurants WHERE id='%@'", number]];
    if ([rs next]) {
        NSString *cloudKit = [rs stringForColumn:@"CloudKit"];

        NSLog(@"CloudKit is %@", cloudKit);

        CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:cloudKit];

        NSLog(@"recordID is %@", recordID);

        [[CKContainer defaultContainer].privateCloudDatabase deleteRecordWithID:recordID completionHandler:^(CKRecordID *recordID, NSError *error) {
            NSLog(@"%@", error);
        }];
    }

    NSString *query = [NSString stringWithFormat:@"delete from restaurants where id='%@'", number];
    [database executeUpdate:query];
}

What am I doing wrong? Or how can I solve/prevent this?


Solution

  • rob mayor is right. You need [rs close]. Would look like this:

    FMResultSet *rs = [database executeQuery:[NSString stringWithFormat:@"SELECT * FROM restaurants WHERE id='%@'", number]];
    if ([rs next]) {
        NSString *cloudKit = [rs stringForColumn:@"CloudKit"];
    
        NSLog(@"CloudKit is %@", cloudKit);
    
        CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:cloudKit];
    
        NSLog(@"recordID is %@", recordID);
    
        [[CKContainer defaultContainer].privateCloudDatabase deleteRecordWithID:recordID completionHandler:^(CKRecordID *recordID, NSError *error) {
            NSLog(@"%@", error);
        }];
    }
    [rs close];