【问题标题】:Sqlite shows EXC_BAD_ACCESS while executing query in iosSqlite 在 ios 中执行查询时显示 EXC_BAD_ACCESS
【发布时间】:2018-09-21 08:45:45
【问题描述】:

我用于执行查询的代码如下:

NSString *score_query = @"Insert into tbl_assessment (Question,Answer,Option1,Option2,Option3,Explanation,Used,ImageName,Reference) values ('All of the following questions would be asked in a lifestyle questionnaire except:','Do you feel any pain in your chest when you perform physical activity?','Does your occupation cause you anxiety (mental stress)?','Does your occupation require extended periods of sitting?','Do you partake in any recreational activities (golf, tennis, skiing, etc.)?','NULL','N','NULL','NULL')";
NSLog(@"%@",score_query);
[database executeQuery:score_query];

我已经动态生成了这个查询。但我已将查询直接添加到字符串中。 但是当我尝试执行这个插入查询时,应用程序在以下函数上崩溃:

- (NSArray )executeQuery:(NSString )sql, ... {
    va_list args;
    va_start(args, sql);

    NSMutableArray *argsArray = [[NSMutableArray alloc] init];
    NSUInteger i;
    for (i = 0; i < [sql length]; ++i)
    {
        if ([sql characterAtIndex:i] == '?')
            [argsArray addObject:va_arg(args, id)];
    }

    va_end(args);

    NSArray *result = [self executeQuery:sql arguments:argsArray];

    [argsArray release];
    return result;
}

我用于数据库操作的类的保管箱如下所示: https://www.dropbox.com/s/c4haxqnbh0re41c/Archive%202.zip?dl=0

我已经参考了以下链接,但无法理解。 Sqlite shows EXC_BAD_ACCESS in ios SDK

【问题讨论】:

  • 您需要向我们提供您调用该方法的行。 argsArraysql 的值。
  • @Larme App 在 [argsArray addObject:va_arg(args, id)] 上崩溃;这一行。
  • 所以代码与SQLite并没有真正的关系。更多的是关于variadic functions" 你应该首先使用这个stackoverflow.com/questions/4804674/… 而不是[sql length] 作为循环,因为你可能会发现更多的“?” than" 参数列表中的对象。如果是这种情况,请自己添加NULL

标签: ios objective-c sqlite exc-bad-access


【解决方案1】:

在您的示例中,您仅将一个参数传递给execQuery:,但您的实现尝试在每次看到“?”时从可变参数中提取其他参数在字符串中,有无数个'?'。

这是导致崩溃的原因。

【讨论】:

  • 那么我该怎么做才能插入值呢? (问号)?你能给我最新更新的 sqlite.h 和 sqlite.m 类的链接吗?
  • @PankajMundra 您可以使用 ?s,但除了 SQL 字符串之外,您没有将任何参数传递给您的方法。坦率地说,手写 SQL 是浪费时间。使用 CoreData 或 FMDB
  • 感谢您的回复,但我已经通过替换 '?' 解决了我的问题用任何其他符号签名。
  • @PankajMundra 您已经解决了症状,但您了解崩溃吗?另外,手工编写 SQL 并直接调用 sqlite 完全是浪费时间。它也极易出错。我从未见过使用 SQLite 的 iOS 代码主体,第一次就直接搞定了。使用核心数据。或 FMDB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多