2

我使用以下代码在 Xcode 中创建数据库。它可以平稳地运行到NSFilemanager代码,但之后它将终止到显示无法创建表的else代码。status.text=@"failed to open/create database";我导入sqlite3.h并创建了sqlDatabase引用变量sqlite3,但它仍然不起作用。

-(void)databaseCreate
{
    NSString *docsDir;
    NSString *dbPath;
    NSArray *dirPath;

    dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    NSLog(@"dirpath::%@",dirPath);

    docsDir=[dirPath objectAtIndex:0];
    NSLog(@"document directory::%@",docsDir);
    dbPath=[[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent:@"timerpro1.db"]];

    NSLog(@"database path::%@",dbPath);
    NSFileManager *fileManager=[NSFileManager defaultManager];

    if([fileManager fileExistsAtPath: dbPath] == NO)
    {
        const char *databsPath=[dbPath UTF8String];
        NSLog(@"treat filemanager");


        if(sqlite3_open(databsPath,&sqlDatabase) == SQLITE_OK)
        {
            char *err;
            NSLog(@"create inside");
            const char *sql_stmt="CREATE TABLE IF NOT EXISTS PRJDATA(ID INTEGER PRIMERY KEY AUTOINCREMENT,PRJ_NAME TEXT,PRJ_DATE TEXT,TIME_POINT1 TEXT,TIME_POINT2 TEXT,TIME_POINT3 TEXT,POINT2_DIFF_MIN TEXT,POINT2_DIFF_SEC TEXT,POINT3_DIFF_MIN TEXT,POINT3_DIFF_SEC TEXT)";

            if (sqlite3_exec(sqlDatabase, sql_stmt, NULL, NULL, &err)!=SQLITE_OK)
            {
                status.text=@"failed to create table";
            }
            sqlite3_close(sqlDatabase);
        }
        else
        {
            status.text=@"failed to open/create database";
        }
    }
    [fileManager release];
}
4

1 回答 1

1

直接的问题是您必须将引用替换NSDocumentationDirectory NSDocumentDirectory

两个旁白:

  1. 当您遇到故障时,您应该检查sqlite3_errmsg(),因为您经常会遇到描述性错误。例如sqlite3_exec(),即使您修正了NSDocumentDirectory错误,您的语句也会失败。

    如果您查看sqlite3_errmsg()错误消息,它会告诉您AUTOINCREMENT子句附近有错误。如果您仔细查看 SQL,您会注意到您拼错了PRIMARY KEY. 如果没有 ,那将更难找到sqlite3_errmsg(),这使我们注意到 SQL 的特定部分。

  2. 您可以简化dbPath声明:

    dbPath=[docsDir stringByAppendingPathComponent:@"timerpro1.db"];`
    
于 2012-12-26T10:00:27.950 回答