Xcode写入数据库但仍然是空的

时间:2012-07-04 12:28:08

标签: objective-c ios database xcode sqlite

首先,我来自西班牙,对我的语法很抱歉。我正在写一些数据到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  我的db 100%肯定有一个表capturas

1 个答案:

答案 0 :(得分:0)

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

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