Ios 使用sqlite在iPhone的xcode中创建表失败

Ios 使用sqlite在iPhone的xcode中创建表失败,ios,ios4,sqlite,Ios,Ios4,Sqlite,我使用以下代码在Xcode中创建数据库。它平稳地运行到NSFilemanager代码,但之后它将终止到else代码,显示状态。text=@“打开/创建数据库失败”因此无法创建表。 我导入了sqlite3.h并创建了sqlDatabase引用变量sqlite3,但它仍然不起作用 -(void)databaseCreate { NSString *docsDir; NSString *dbPath; NSArray *dirPath; dirPath=NSSearc

我使用以下代码在Xcode中创建数据库。它平稳地运行到
NSFilemanager
代码,但之后它将终止到
else
代码,显示
状态。text=@“打开/创建数据库失败”因此无法创建表。
我导入了
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];
}

眼前的问题是,您必须将对
NSDocumentationDirectory
的引用替换为
NSDocumentDirectory

两个旁白:

  • 当您遇到故障时,应该检查
    sqlite3\u errmsg()
    ,因为您经常会遇到描述性错误。例如,您的
    sqlite3\u exec()
    语句将失败,即使您修复了
    NSDocumentDirectory
    错误

    如果查看
    sqlite3\u errmsg()
    错误消息,它将告诉您在
    AUTOINCREMENT
    子句附近有一个错误。如果仔细查看SQL,您会注意到您拼错了
    主键
    。如果没有
    sqlite3\u errmsg()
    ,这将更难找到,因为它让我们注意到SQL的特定部分

  • 您可以简化
    dbPath
    声明:


  • 当我使用sqlite3_errmsg()时;在上面提到的代码中,它将生成类似于日志的库例程,按顺序调用,在创建表时不会出现任何其他错误。@hirangsheth这就是文档要说的。简而言之,这意味着调用
    sqlite3
    函数的顺序是错误的。您上面问题的代码(上面有我的两个修复程序)对我来说很好,所以我猜您对代码做了一些更改?也许在关闭数据库后尝试另一个
    sqlite3
    函数?也许你可以在一个新的问题中发布该代码,如果解决方案不是突如其来的话。
    dbPath=[docsDir stringByAppendingPathComponent:@"timerpro1.db"];`