0

まず第一に、私はスペイン出身なので、私の文法について申し訳ありません. 私はいくつかのデータをsqliteデータベースに書き込んでいます。これが私のコードです:

データベース、テーブル、および列の名前が問題ないことをすべて確認しました。何かを変更するとエラーが発生するため、コードは正しく機能します。

@try {

    NSFileManager *fileMgr=[NSFileManager defaultManager];

    NSString *dbPath=[self database]; 
    BOOL succes=[fileMgr fileExistsAtPath:dbPath];
    if(!succes)
    {
        NSLog(@"Cannot locate database '%@'.",dbPath);
    }
    if (!(sqlite3_open([dbPath UTF8String], &dbcapturas)==SQLITE_OK)) {
        NSLog(@"An error has occured: %@",sqlite3_errmsg(dbcapturas));
    }

    //sqlite3_stmt *sqlStatement;
    NSString *asd=numero.text;
    NSString *insertStatement=[NSString stringWithFormat:@"INSERT INTO captura(key,tecnico, fecha,provincia,municipio,latitud,longitud,altura,familia,especie,numero,comentario)Values(\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",asd,tecnico,fechaHora,tecnico,municipio,latitud,longitud,altura,tecnico,animal,asd,coment];
    char *error;
    if((sqlite3_exec(dbcapturas, [insertStatement UTF8String], NULL, NULL, &error))==SQLITE_OK)
    {
        NSLog(@"Person inserted.");
    }
    else
    {
        NSLog(@"Error: %s", error);
    }
} @catch (NSException *exception) { 
    NSLog(@"fail"); 
}
@finally {
        NSLog(@"cerrada");
    sqlite3_close(dbcapturas);
}

保存ボタンを初めてクリックすると、次のようになります。

2012-07-04 12:17:45.644 adasdasd[1783:f803] 人が挿入されました。

そして二度目に私が得る:

2012-07-04 12:29:18.959 adasdasd[1840:f803] エラー: 列キーが一意ではありません

私のコードは問題ないはずですが、Firefoxアドオンでデータベースを開くと、完全に空になります。

編集:私は今電話します

-(NSString *)database{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"capturas.sqlite"];
}

しかし今、私は私に言うエラーを受け取ります: no such table: capturas I have a table capturas in my db 100% sure

4

1 に答える 1

0

テーブルを設定するとき、列keyはおそらくインデックス付けされているか、一意または自動インクリメントになるように定義されています。挿入を行うときは、特定のキー、つまり variable にあるものを渡しますasdkey2 回目に試行すると、列が一意である必要があるため、sqlite エラーが発生します。自動インクリメントの場合は、そのままにしておくと自動的に入力されます。

正しく閉じた場合、最初のエントリがデータベースにあるはずです。Firefox でデータベースの正しいコピーをチェックしていることを確認してください (たとえば、アプリ デリゲートにダミー レコードを挿入してテストします)。

于 2012-07-04T12:39:54.677 に答える