0

ここで、次のコードを最適化します。データベース パスまで完璧になりました。つまり、NSLog(@"in save data::%s",dbasePath); ただし、その後は条件コードの場合は最適化できません

-(void)saveData{
    sqlite3_stmt *statment;
    dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir=[dirPath objectAtIndex:0];
    const char *dbasePath=[dbPath UTF8String];
    NSLog(@"in save data::%s",dbasePath);

    if (sqlite3_open(dbasePath, &sqlDatabase)) {
        NSString *insert_query=[NSString stringWithFormat:@"INSERT INTO PRJDATA VALUES(\"%@\",\"%@\"\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",title,timeGet1.text,timeGet2.text,timeGet3.text,dateField.text,interval1.text,interval2.text];
        NSLog(@"query string::%@",insert_query);
        const char *insert_stmt=[insert_query UTF8String];
        NSLog(@"error in insert::%s",sqlite3_errmsg(sqlDatabase));
        sqlite3_prepare_v2(sqlDatabase, insert_stmt, -1, &statment, NULL);
        if (sqlite3_step(statment)==SQLITE_DONE) {
            status.text=@"content added";
            timeGet1.text=@"";
            timeGet2.text=@"";
            timeGet3.text=@"";
            dateField.text=@"";
            interval1.text=@"";
            interval2.text=@"";

        }
        else{
            status.text=@"failed to add";
        }
        sqlite3_finalize(statment);
        sqlite3_close(sqlDatabase);

    }
}
4

1 に答える 1

1

いくつかの考え:

  1. なぜ設定dirPathし、使用しない場合はdocsDirdbasePathこれはdbPath、おそらくに基づいて定義することを意図した使用法ですがdocsDir、ここではどこにも定義しません。

  2. NSLogまた、コードサンプルの結果を教えていただけますか?それに応じて質問を更新してください。それをすることには意味がありませんNSLogが、それを私たちと共有することはありません。

  3. 他の回答で提案したように、エラーが発生した場合は、sqlite3_errmsg何が問題だったかがわかるので、を表示してください。SQLiteに何が問題なのかを教えてもらえるのはなぜだと思いますか?結果が表示されない場合は、気が狂いますsqlite3_errmsg

  4. あなたVALUESINSERTステートメントは、テーブルのすべての列を反映していますか?そうでない場合は、INSERT値に対応する列の名前を含めるようにステートメントを変更する必要があります。

    INSERT INTO TABLE1 (COL1, COL2, COL3) VALUES ("VALUE1", "VALUE2", "VALUE3");
    
  5. INSERTを使用して文字列を作成するべきではありませんstringWithFormat?プレースホルダーを使用してから、関数を使用する必要がありsqlite3_bind_ます。関数の例については、「END」の実行時にロックされたSqliteデータベースを参照してくださいsqlite3_bind(質問は無視してください。ただしsqlite3_bind、コードサンプルのステートメントを確認してください)。titleこれにより、フィールドに二重引用符が含まれている場合など、現在のルーチンが破損するような奇妙な例外に対処する必要がなくなります。また、SQLインジェクション攻撃からユーザーを保護します。それはただ賢明です。

于 2012-12-27T07:29:19.643 に答える