2014-01-09 103 views
1

下面是在源码数据库提取数据的代码:的SQLite数据库崩溃

-(id) init { 
    if ((self = [super init])) { 
     NSString *sqLiteDb = [[NSBundle mainBundle]pathForResource:@"CourseFindr" ofType:@"sqlite"]; 
     if (sqlite3_open([sqLiteDb UTF8String], &_db) != SQLITE_OK){ 
      NSLog(@"Failed to open database!"); 
     } 
    } 
    return self; 
} 

-(void)dealloc { 
    sqlite3_close(_db); 
} 

- (NSArray *)job { 
    NSMutableArray *retrieve = [[NSMutableArray alloc] init]; 
    NSString *query = @"SELECT jID, jName, jDesc, jEarnings, jTags FROM jobs"; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(_db, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      int _jID = sqlite3_column_int(statement, 0); 
      char *jNameChars = (char *) sqlite3_column_text(statement,1); 
      char *jDescChars = (char *) sqlite3_column_text(statement, 2); 
      char *jEarningsChars = (char *) sqlite3_column_text (statement, 3); 
      char *jTagsChars = (char *) sqlite3_column_text(statement, 4); 
      NSString *_jName =[[NSString alloc]initWithUTF8String:jNameChars]; 
      NSString *_jDesc = [[NSString alloc]initWithUTF8String:jDescChars]; 
      NSString *_jEarnings = [[NSString alloc]initWithUTF8String:jEarningsChars]; 
      NSString *_jTags = [[NSString alloc]initWithUTF8String:jTagsChars]; 
      Jobs *jobs = [[Jobs alloc] 
          initWithJID:_jID 
           jName:_jName 
           jDesc:_jDesc 
          jEarnings:_jEarnings 
           jTags:_jTags]; 
      [retrieve addObject:jobs]; 
     } 
     sqlite3_finalize(statement); 
    } 
    return retrieve; 
} 

但它一直得到这个崩溃:

2014-01-09 21:12:39.565 CourseFindr[4595:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithUTF8String:]: NULL cString' 
*** First throw call stack: 
(
    0 CoreFoundation      0x018255e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x015a88b6 objc_exception_throw + 44 
    2 CoreFoundation      0x018253bb +[NSException raise:format:] + 139 
    3 Foundation       0x0120fb49 -[NSString initWithUTF8String:] + 89 
    4 CourseFindr       0x000036b5 -[CourseFindrDB jobs] + 645 
    5 libdyld.dylib      0x01e61725 start + 0 
    6 ???         0x00000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

我不知道这是否是因为我libsqlite3的。 dylib还是与我的数据库不兼容? 我的数据库被命名为“CourseFindr.sqlite”表是

JOBS Table 
-jID PK 
-jName 
-jDesc 
-jEarnings 
-jTags 

而且它不断重定向时崩溃来的main.m。

我以前做过这个,但没有错误。这一次,我尝试没有教程,但似乎我错过了一些东西。 :/

回答

2

崩溃日志:

2014年1月9日21:12:39.565 CourseFindr [4595:A0B] *终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因:“* - [NSPlaceholderString initWithUTF8String:]:NULL cString'

告诉你,你正在传递一个NULL指针到initWithUTF8String。这是飞机坠毁的原因,并根据Apple docs预期的行为:

initWithUTF8String:

...

要点:如果字节为NULL,则抛出一个例外。

因此,检查你正在传递到initWithUTF8String方法,并添加防止传递NULL。例如:

char *jNameChars = (char *) sqlite3_column_text(statement,1); 
... 
NSString *_jName = jNameChars?[[NSString alloc]initWithUTF8String:jNameChars]:@""; 
+0

好的,我会试试。但我可以在sqlite管理器中将它们设置为不是NULL吗? – hazelvan

+0

请参阅我的编辑。 – sergio

+0

@sergio OP正在访问0-4列,而不是1-4。再看看问题中的代码。 – rmaddy

0

您可以在例外的第一行找到解决方案。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithUTF8String:]: NULL cString' 

这意味着您将一个空字符串传递给initWithUTF8String方法。

0

NSLog记录您传递的所有字符串。因为你传递一个空值到initWithUTF8String