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"];
}

但现在我收到一条错误消息:没有这样的表:capturas 我的数据库中有一个表 capturas 100% 肯定

4

1 回答 1

0

设置表时,该列key可能已编入索引或定义为唯一的或自动递增的。当您进行插入时,您传递了一个特定的键,即变量中的任何内容asd。如果您第二次尝试,您将收到 sqlite 错误,因为该列key必须是唯一的。如果是自动递增的,不填,它会自动填充。

如果您正确关闭它,第一个条目应该在数据库中。确保您正在使用 Firefox 检查正确的数据库副本(例如,通过在应用程序委托中插入虚拟记录进行测试)。

于 2012-07-04T12:39:54.677 回答