FMDB 和索引 0 超出空数组的范围
Posted
技术标签:
【中文标题】FMDB 和索引 0 超出空数组的范围【英文标题】:FMDB and index 0 beyond bounds for empty array 【发布时间】:2014-11-29 14:47:31 【问题描述】:我正在疯狂地尝试调试它。我试图在我的 SQLite 数据库中复制一行并增加一个值。我在代码的其他地方使用了类似的插入语句并且没有问题,但是这次它不合作。程序到达 executeUpdate 语句时出错。
我对 ios 编程比较陌生,我已经尽可能地靠自己了。
这是我的功能:
+ (BOOL)updatePetWithNewVet:(NSNumber *)i
NSString *appSupportDir = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbPath = [appSupportDir stringByAppendingPathComponent:@"pets.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:dbPath];
[database open];
FMResultSet *results = [database executeQuery:@"Select * from vets order by vetID desc limit 1"];
if ([results next])
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSInteger vID = [results intForColumn:@"vetID"];
NSInteger vID2 = vID+1;
NSNumber *newVetID = [NSNumber numberWithInteger:vID2];
NSString *vName = [results stringForColumn:@"vetName"];
NSString *vPhone = [results stringForColumn:@"vetPhone"];
NSString *vStreet = [results stringForColumn:@"vetStreet"];
NSString *vCity = [results stringForColumn:@"vetCity"];
NSString *vState = [results stringForColumn:@"vetState"];
NSNumber *vZipcode = [f numberFromString:[results stringForColumn:@"vetZipcode"]];
NSLog(@"%@", vName);
NSLog(@"%@", vPhone);
NSLog(@"%@", vStreet);
NSLog(@"%@", vCity);
NSLog(@"%@", vState);
NSLog(@"%@", vZipcode);
NSLog(@"VET ID: %ld", (long)vID);
NSLog(@"NEW VET ID: %@", newVetID);
[results close];
[database executeUpdateWithFormat:@"INSERT INTO vets (vetID, vetName, vetPhone, vetStreet, vetCity, vetState, vetZipcode) Values (?, ?, ?, ?, ?, ?, ?)", newVetID, vName, vPhone, vStreet, vCity, vState, vZipcode, nil];
NSLog(@"%@", [database lastErrorMessage]);
[database close];
return 1;
而且它不工作。这是我崩溃时得到的结果:
2014-11-29 09:35:54.722 PetJournal[58823:8400345] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(
0 CoreFoundation 0x000000010eb37f35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010e7d0bb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010ea22f33 -[__NSArrayM objectAtIndex:] + 227
3 PetJournal 0x000000010cc1744e -[FMDatabase executeUpdate:error:withArgumentsInArray:orDictionary:orVAList:] + 2542
4 PetJournal 0x000000010cc17fa8 -[FMDatabase executeUpdate:withArgumentsInArray:] + 152
5 PetJournal 0x000000010cc1834d -[FMDatabase executeUpdateWithFormat:] + 637
6 PetJournal 0x000000010cc54fd7 +[UIView(Database) updatePetWithNewVet:] + 1159
7 PetJournal 0x000000010cc549d2 +[UIView(Database) createPetNamed:withBirthday:] + 1522
8 PetJournal 0x000000010cc3165e -[AddPetViewController savePet:] + 398
9 UIKit 0x000000010d07a8be -[UIApplication sendAction:to:from:forEvent:] + 75
10 UIKit 0x000000010d181410 -[UIControl _sendActionsForEvents:withEvent:] + 467
11 UIKit 0x000000010d1807df -[UIControl touchesEnded:withEvent:] + 522
12 UIKit 0x000000010d0c0308 -[UIWindow _sendTouchesForEvent:] + 735
13 UIKit 0x000000010d0c0c33 -[UIWindow sendEvent:] + 683
14 UIKit 0x000000010d08d9b1 -[UIApplication sendEvent:] + 246
15 UIKit 0x000000010d09aa7d _UIApplicationHandleEventFromQueueEvent + 17370
16 UIKit 0x000000010d076103 _UIApplicationHandleEventQueue + 1961
17 CoreFoundation 0x000000010ea6d551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
18 CoreFoundation 0x000000010ea6341d __CFRunLoopDoSources0 + 269
19 CoreFoundation 0x000000010ea62a54 __CFRunLoopRun + 868
20 CoreFoundation 0x000000010ea62486 CFRunLoopRunSpecific + 470
21 GraphicsServices 0x00000001114139f0 GSEventRunModal + 161
22 UIKit 0x000000010d079420 UIApplicationMain + 1282
23 PetJournal 0x000000010cc33f63 main + 115
24 libdyld.dylib 0x000000010f2d2145 start + 1
25 ??? 0x0000000000000001 0x0 + 1
)
【问题讨论】:
没有改变任何东西,但为了安全我添加了它。 【参考方案1】:您正在使用executeUpdateWithFormat
,但未在 SQL 中使用printf
样式的语法。将executeUpdateWithFormat
与printf
样式的格式字符串一起使用,或者将executeUpdate
与?
占位符一起使用。
就个人而言,我建议您只使用executeUpdate
(并从列表末尾删除nil
)。
【讨论】:
我之前尝试过,现在再次尝试,但现在发生的是程序冻结。日志中没有错误或崩溃,只是程序停止了。 我做到了。它在 executeUpdate 行冻结。 那么这表明您必须在该数据库上打开一些其他查询,该查询将锁定该表。 你是对的。我打开了另一个查询,修复后,它运行良好。如果您更新答案以提及我的数据库因此被锁定,我将其标记为正确。 最初的问题没有提到冻结,而只是关于executeUpdateWithFormat
的“超出范围”,我试图在上面回答。编辑我的答案以涵盖原始问题中未提出的主题对我来说毫无意义。坦率地说,虽然我很乐意提供帮助,但关于锁定查询的讨论完全不相关,根本不属于这个问题(此外,锁定问题在 S.O. 的其他地方已经详细讨论过,不需要再次讨论在这里,而您的executeUpdateWithFormat
问题有些新颖)。以上是关于FMDB 和索引 0 超出空数组的范围的主要内容,如果未能解决你的问题,请参考以下文章
数据源方法collectionView:numberOfItemsInSection:崩溃应用程序“索引0超出空数组的范围”
IOS 应用程序崩溃:[__NSArrayI objectAtIndex:]:空数组的索引 0 超出范围
由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”
由于未捕获的异常“NSRangeException”而终止应用程序,原因:-[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围
由于未捕获的异常“NSRangeException”而终止应用程序,原因:-[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围-2