如何将文本值绑定到iphone中的sqlite3数据库

时间:2009-11-27 10:31:02

标签: iphone objective-c sqlite

我正在为一部电影开发一个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);}

任何人都可以帮助我。

3 个答案:

答案 0 :(得分:3)

您使用的是sqlite3_prepare_v2()sqlite3_finalize()错误。您只准备一次语句,然后您可以根据需要将值绑定到它。完成后,请致电sqlite3_reset()。如果您已完成此语句并且不会再次使用它(即您退出应用程序),那么您将使用finalize。

您的应用程序崩溃是因为您最终确定了该语句,但指针detailStmt仍然指向您的语句曾经的位置,并尝试访问该内存区域。

另见:http://www.sqlite.org/c3ref/prepare.html

答案 1 :(得分:2)

正如托比指出的那样,变量pvr,fame,cinemax和big(以及重新分配的pvr1,fame1,cinemax1和big1)在从-stringWithUTF8String:返回时自动释放,但你永远不会保留它们。在此之后对这些变量的任何访问都将导致崩溃。

你说你看到了抛出的异常。通过检查控制台输出,知道该异常是什么可能会有所帮助。此外,您可以在libobjc.A.dylib中的objc_exception_throw上启用断点,然后使用断点进行调试,以查找发生此异常的确切行。

答案 2 :(得分:1)

在我有限的Iphone体验中,当某些东西运行一次然后在下一次迭代时崩溃时,通常你会释放你不应该释放的内存或不释放你应该存在的内存。尝试查看问题的内存分配。