Nit*_*ish 12 sqlite grand-central-dispatch ios
我写了一个触发的查询viewWillAppear.通过快速导航回到该屏幕导致崩溃sqlite3_prepare_v2.
我假设的是崩溃是由于之前的查询没有最终确定.
我正在调用数据库操作,dispatch_async因为我首先更新远程数据,然后将其保存在数据库中.
代码如下所示:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
[self parseActivityResponse:data]; // Sqlite operation here
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
if(loaderImageview)
[loaderImageview removeFromSuperview];
[tableActivities reloadData];
});
});
Run Code Online (Sandbox Code Playgroud)
查询如下:
- (NSMutableArray*)GetAllInvitations:(NSString*)ActivityId
{
NSMutableArray *arrInvitations = [[NSMutableArray alloc]init];
sqlite3_stmt *statement = nil;
@try {
const char *sql = "SELECT * FROM Invitation where ActivityId = ?";
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
sqlite3_bind_text(statement, 1, [ActivityId UTF8String], -1, SQLITE_TRANSIENT);
while (sqlite3_step(statement) == SQLITE_ROW) {
char *dbString;
Invitation *invitation = [[Invitation alloc]init];
dbString = (char *)sqlite3_column_text(statement, 0);
NSString *Id = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setId:Id];
dbString = (char *)sqlite3_column_text(statement, 1);
NSString *childName = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setChildName:childName];
dbString = (char *)sqlite3_column_text(statement, 2);
NSString *response = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setResponse:response];
dbString = (char *)sqlite3_column_text(statement, 3);
NSString *invitationId = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setInvitationId:invitationId];
dbString = (char *)sqlite3_column_text(statement, 4);
NSString *isCoGaurdian = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setIsCoGaurdian:isCoGaurdian];
dbString = (char *)sqlite3_column_text(statement, 5);
NSString *activityId = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setActivityId:activityId];
dbString = (char *)sqlite3_column_text(statement, 6);
NSString *picture = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setPicture:picture];
dbString = (char *)sqlite3_column_text(statement, 7);
NSString *invitationUserId = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setInvitedUserId:invitationUserId];
dbString = (char *)sqlite3_column_text(statement, 8);
NSString *roleId = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setRoleId:roleId];
dbString = (char *)sqlite3_column_text(statement, 9);
NSString *status = (dbString) ? [NSString stringWithUTF8String:dbString] : @"";
[invitation setStatus:status];
[arrInvitations addObject:invitation];
}
}
else
{
NSLog(@"Failed to create table: %s", sqlite3_errmsg(database));
}
}
@catch (NSException *exception) {
NSLog(@"Error in GetAllInvitations : %@", exception.description);
}
@finally {
sqlite3_finalize(statement);
}
return arrInvitations;
}
- (NSMutableArray*)GetAllActivities{
NSMutableArray *arrProjects = [[NSMutableArray alloc]init];
sqlite3_stmt *statement = nil;
@try {
const char *sql = "SELECT * FROM Activity";
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
NSLog(@"success");
while (sqlite3_step(statement) == SQLITE_ROW) {
.........
activity.arrInvitations = [self GetAllInvitations:activityId];
[arrProjects addObject:activity];
}
}
else
{
NSLog(@"Prepare-error #%i: %s", sqlite3_prepare_v2(database, sql, -1, &statement, NULL), sqlite3_errmsg(database));
}
}
@catch (NSException *exception) {
NSLog(@"Error in GetAllActivities : %@", exception.description);
}
@finally {
sqlite3_finalize(statement);
}
return arrProjects;
}
Run Code Online (Sandbox Code Playgroud)
我打电话GetAllActivities来自viewWillAppear:
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self reloadData];
}
-(void)reloadData
{
[self getRemoteActivities:^(BOOL finished) {
if(finished){
if([TGProjectHandler hasExistingSession])
{
[self getActivities];
}
else
[self login];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
你的想法和解决方案?
创建一个串行队列:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)
这应该管理对数据库的顺序访问.
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |