微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – sqlite3_prepare_v2 crash – 已经运行上一个查询

我写了一个在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];

                     });
                 });

查询如下:

- (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],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,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,NULL),sqlite3_errmsg(database));
        }
    }
    @catch (NSException *exception) {

        NSLog(@"Error in GetAllActivities : %@",exception.description);
    }
    @finally {

        sqlite3_finalize(statement);
    }

    return arrProjects;
}

我从viewWillAppear调用GetAllActivities:

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

你的想法和解决方案?

解决方法

创建一个串行队列:
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",disPATCH_QUEUE_SERIAL);

并且应该管理对数据库的顺序访问.

原文地址:https://www.jb51.cc/iOS/336017.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐