-1

sqlite私は多くの方法でデータベースにデータを挿入するために実装しようとしました。実行時に実行されたコードは挿入されたIDを返しますが、データベースをチェックすると何も挿入されません。誰かが問題が何であるか知っていますか?よろしくお願いします。ここで実装したコード:

sqlite3 *database;
sqlite3_stmt *addStmt;
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"MoviePlayerMgmt.rdb"];
BOOL success =[fileMgr fileExistsAtPath:dbPath];
if(!success)
{
    NSLog(@"Cannot locate file %@",dbPath);

}
else{
    NSLog(@"__________Open the file__________ %@",dbPath);

    if(!(sqlite3_open([dbPath UTF8String], &database)==SQLITE_OK))
    {
        NSLog(@"An error has occured: %@",[NSString stringWithUTF8String:(char *) sqlite3_errmsg(database)]);
    }
    else{
        NSLog(@"Open database");
        NSString *strName = txtName.text;
                              NSLog(@"Computer name is %@",strName);
                             NSString *strIP = txtIP.text;
                             NSString *strPort = txtPort.text;
        NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO COMPUTER (computerName, IPAddress, portNumber) VALUES (\"%@\", \"%@\", \"%@\")", strName, strIP, strPort];

        char *error;
        if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
        {
            int computerID = sqlite3_last_insert_rowid(database);


              NSLog(@"A computer inserted. %d",computerID);
              sqlite3_close(database);
        }
        else
        {
            NSLog(@"Error: %s", error);
        }

    }
}
4

1 に答える 1

5

アプリのリソースバンドルは読み取り専用です(少なくとも実際のiOSデバイスでは)。アプリのリソースバンドル内のデータベースに書き込むことはできません。

アプリを初めて実行するときは、初期データベースをアプリのバンドルからアプリのサンドボックス内の書き込み可能な別のディレクトリにコピーする必要があります。次に、このコピーを常に読み取りと書き込みに使用します。

編集:

sqlite3_openまた、の使用法をに変更する必要がありますsqlite3_open_v2。これにより、もう少し制御できます。

また、文字列形式を使用して挿入ステートメントのようなクエリを作成しないでください。?を使用してクエリを作成する必要があります。各変数の記号。次に、適切なsqlite3_bind_xxx関数を使用して、適切な値をステートメントにバインドします。これにより、値が適切にエスケープされます。

于 2012-11-20T04:44:18.533 に答える