FMDatabase 数据库已锁定
FMDatabase database locked
因此,我创建了一个存储一些数据的应用程序。但是,每次调用我编写的删除函数,然后调用另一个函数后,我都会收到一条错误消息 database locked
.
这是函数:
+ (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];
}
我做错了什么?或者我怎样才能 solve/prevent 这个?
罗布市长是对的。你需要 [rs close]。看起来像这样:
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];
user4992124 我会给你示例代码,用于删除 data.Please 自定义与你的编码有关的代码。
- (IBAction)actionDelete:(id)sender
{
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [dirPaths objectAtIndex:0];
NSString *databasePath = [docDir stringByAppendingPathComponent:@"yourDBName.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:databasePath];
[database open];
[database executeUpdate:@"delete from phone where id = ?",number];
UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Sample SQLite" message:@"Deleted Successfully" delegate:Nil cancelButtonTitle:@"OK"otherButtonTitles: nil];
[alert show];
[database close];
}
因此,我创建了一个存储一些数据的应用程序。但是,每次调用我编写的删除函数,然后调用另一个函数后,我都会收到一条错误消息 database locked
.
这是函数:
+ (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];
}
我做错了什么?或者我怎样才能 solve/prevent 这个?
罗布市长是对的。你需要 [rs close]。看起来像这样:
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];
user4992124 我会给你示例代码,用于删除 data.Please 自定义与你的编码有关的代码。
- (IBAction)actionDelete:(id)sender
{
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [dirPaths objectAtIndex:0];
NSString *databasePath = [docDir stringByAppendingPathComponent:@"yourDBName.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:databasePath];
[database open];
[database executeUpdate:@"delete from phone where id = ?",number];
UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Sample SQLite" message:@"Deleted Successfully" delegate:Nil cancelButtonTitle:@"OK"otherButtonTitles: nil];
[alert show];
[database close];
}