2

Xcodeでデータベースを作成するために次のコードを使用しました。コードまではスムーズに実行されますが、その後はテーブルを作成できないというコードでNSFilemanager終了します。参照変数をインポートして作成しましたが、機能しません。elsestatus.text=@"failed to open/create database";sqlite3.hsqlDatabasesqlite3

-(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

2つの傍白:

  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 に答える