我正在为一部电影开发一个app,我需要考虑一些限制从数据库中获取数据。它在第一次运行时非常有效,但是当我第二次尝试获取数据时,它会抛出运行时异常(应用程序崩溃)。我必须绑定3个占位符。 2是文本,1是整数类型。这是我用来从数据库中获取数据的代码。
-(void) Data2
{
databaseName = @"Cinema1.sqlite";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath =[documentsDir stringByAppendingPathComponent:databaseName];
[self checkAndCreateDatabase];
sqlite3 *database;
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
if(detailStmt == nil)
{
const char *sql = "Select PVR,Fame,Cinemax,Big from listing where UPPER(State) = UPPER(?) and UPPER(City) = UPPER(?) and ZIP = ?";
if(sqlite3_prepare_v2(database, sql, -1, &detailStmt, NULL) == SQLITE_OK)
{
NSLog(@"Hiiiiiii");
sqlite3_bind_text(detailStmt, 1, [t1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(detailStmt, 2, [t2 UTF8String], -2, SQLITE_TRANSIENT);
sqlite3_bind_int(detailStmt, 3, t3);
if(SQLITE_DONE != sqlite3_step(detailStmt))
{
NSLog(@"Helllloooooo");
NSString *pvr= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 0)];
NSString *fame= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 1)];;
NSString *cinemax = [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 2)];
NSString *big= [NSString stringWithUTF8String:(char *)sqlite3_column_text(detailStmt, 3)];
pvr1 = pvr;
fame1 = fame;
cinemax1 = cinemax;
big1 = big;
NSLog(@"PVR %@ Fame %@ Cinemax %@ Big %@",pvr1,fame1,cinemax1,big1);
}
}
sqlite3_finalize(detailStmt);
}
}
sqlite3_close(database);}
任何人都可以帮助我。
答案 0 :(得分:3)
您使用的是sqlite3_prepare_v2()
和sqlite3_finalize()
错误。您只准备一次语句,然后您可以根据需要将值绑定到它。完成后,请致电sqlite3_reset()
。如果您已完成此语句并且不会再次使用它(即您退出应用程序),那么您将使用finalize。
您的应用程序崩溃是因为您最终确定了该语句,但指针detailStmt
仍然指向您的语句曾经的位置,并尝试访问该内存区域。
答案 1 :(得分:2)
正如托比指出的那样,变量pvr,fame,cinemax和big(以及重新分配的pvr1,fame1,cinemax1和big1)在从-stringWithUTF8String:返回时自动释放,但你永远不会保留它们。在此之后对这些变量的任何访问都将导致崩溃。
你说你看到了抛出的异常。通过检查控制台输出,知道该异常是什么可能会有所帮助。此外,您可以在libobjc.A.dylib中的objc_exception_throw上启用断点,然后使用断点进行调试,以查找发生此异常的确切行。
答案 2 :(得分:1)
在我有限的Iphone体验中,当某些东西运行一次然后在下一次迭代时崩溃时,通常你会释放你不应该释放的内存或不释放你应该存在的内存。尝试查看问题的内存分配。