iOS + sqlite问题(EXC_BAD_ACCESS)
问题描述:
我有一个非常奇怪的问题。我有一种方法可以很好地工作,但我试图将其转换为使数据更多地驱动数据库与当前存在的硬编码。当我添加一个对数据库方法的调用来提取数据时,我得到一个EXC_BAD_ACCESS long数据库内容完成后。我把它缩小到数据库的东西,因为如果我根本不打电话,崩溃不会发生。iOS + sqlite问题(EXC_BAD_ACCESS)
所以,在调用方法看起来是这样的(这就是如果我注释掉,它不会崩溃):
NSString *thisRoomNumber = [self readLocationsFromDatabaseBetweenPoints:fX YPoint:fY];
和方法本身是这样的:
#pragma mark -
#pragma mark SQL Operations
- (NSString *)readLocationsFromDatabaseBetweenPoints:(float)tapPointX YPoint:(float)tapPointY{
// Setup some globals
databaseName = @"db.sqlite";
// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
// Setup the database object
sqlite3 *database;
NSString *sqlStringBuilder = [NSString stringWithFormat:@"select * from floors where propertyid = ? and floorid = ? and %f between topleftxcoord and bottomrightxcoord and %f between topleftycoord and bottomrightycoord", tapPointX, tapPointY];
NSString *roomNumber = @"0";
// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
// Setup the SQL Statement and compile it for faster access
const char *sqlStatement = [sqlStringBuilder UTF8String];
NSLog(@"%@", [NSString stringWithUTF8String:sqlStatement]);
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, iPropertyId);
sqlite3_bind_int(compiledStatement, 2, iFloorId);
// Loop through the results and add them to the feeds array
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Read the data from the result row
NSInteger aLocId = sqlite3_column_int(compiledStatement, 0);
NSInteger aTLX = sqlite3_column_int(compiledStatement, 1);
NSInteger aTLY = sqlite3_column_int(compiledStatement, 2);
NSInteger aBRX = sqlite3_column_int(compiledStatement, 3);
NSInteger aBRY = sqlite3_column_int(compiledStatement, 4);
NSString *aRoomIdent = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
roomNumber = aRoomIdent;
}
}else{
NSLog(@"%d", sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL));
}
// Release the compiled statement from memory
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
[documentsDir release];
[documentPaths release];
//[roomNumber release];
[sqlStringBuilder release];
return roomNumber;
}
调用本身工作正常。我按照预期得到了结果,“thisRoomNumber”返回了我期望的结果。一旦调用方法踢出到下一个部分,它就会返回到委托,在此时它崩溃。我知道很难看到发生了什么,没有很多代码可以使用,但是大量的代码会使这个帖子成为MASSIVE。
希望这会给我们一个解决这个问题的出发点。另外,崩溃日志转储对此没有任何用处。
感谢您提供任何帮助!如果您需要更多信息,请告诉我,我会尽我所能根据需要添加此信息。
您可能意外地减少了您不应该做的事情的引用计数:“构建和分析”会提供任何警告吗? – James 2011-05-09 16:53:26
我根本没有得到任何真实的警告(除了我知道的一些东西,不会破坏任何东西 - 一些未使用的值等,但那些东西永远在那里,我只是没有回过头来完成那部分) – SlackerCoder 2011-05-09 17:19:01