数据库应用无法正常工作

时间:2011-03-24 05:44:22

标签: iphone sqlite

在我的应用程序中,我在一个循环中多次打开数据库然后再次打开数据库,它将不会执行if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK)此语句,因此我的应用程序无法工作....

-(NSString *)getDBPath
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"BasicGreetings.sqlite"];

}



-(void) fillimage:(NSInteger)imgno
{
    testAppDelegate *appDelg = (testAppDelegate *)[[UIApplication sharedApplication]delegate];

    sqlite3 *database= nil;

    if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK)
    {

        const char *sql = "select setflag from Tblsetflag where imgNo = ?";
        sqlite3_stmt *selectStmt = nil;

        if (sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK) 
        {
            sqlite3_bind_int(selectStmt, 1,imgno);

            while (sqlite3_step(selectStmt) == SQLITE_ROW)
            {
                appDelg.a = sqlite3_column_int(selectStmt, 0);
                NSLog(@"%d",appDelg.a);
            }
        }


    }
    sqlite3_close(database);



}

2 个答案:

答案 0 :(得分:3)

你可以将代码发布到getDBPath,我怀疑它找不到文件...检查从该方法返回的值(在模拟器中运行)并浏览Finder中的模拟器文档目录并验证文件是否存在

答案 1 :(得分:1)

不要在-fillimage:方法的每次传递中打开和关闭数据库。你真的应该在你的应用程序开始时(或者当你的应用程序从后台运行时)打开它,并在你的应用程序退出或进入后台时关闭它。

您也永远不会完成准备好的陈述,这可能会导致sqlite3_close()失败。同样,您可能希望创建一个预准备语句,然后在每次运行该方法时重置它,并在SQLite数据库关闭之前完成它。