Objective c SQLite3(iOS)查询未执行

Objective c SQLite3(iOS)查询未执行,objective-c,ios,cocoa-touch,sqlite,Objective C,Ios,Cocoa Touch,Sqlite,我很难让它工作 这是我要执行的代码: [self openDB]; sqlite3_stmt *statement; NSString *sql2 = [NSString stringWithFormat:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, Percentage, UserId) VALUES ('ola232332332324', '2012-02-03', 1, 1, NULL, 1)"]; if(sqlite3

我很难让它工作

这是我要执行的代码:

[self openDB];
sqlite3_stmt *statement;
NSString *sql2 = [NSString stringWithFormat:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, Percentage, UserId) VALUES ('ola232332332324', '2012-02-03', 1, 1, NULL, 1)"];
if(sqlite3_prepare_v2(db, [sql2 UTF8String], -1, &statement, NULL) == SQLITE_OK)
{
    alert1 = [[UIAlertView alloc]
              initWithTitle:@"Grats" message:@"The query was executed!" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles: nil];
    [alert1 show];
    [alert1 release];
} 
else {
    NSAssert(0, @"Failed to execute");
}
sqlite3_finalize(statement);
这是我用来调用db的代码:

-(NSString *) filePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"prosegur.sqlite"];
}

-(void) openDB {
    sqlite3_open([[self filePath] UTF8String], &db);
    if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK){
        NSAssert(0, @"Failed to open db");
    }
}
编辑:尝试使用FMDB,代码如下:

FMDatabase *database = [FMDatabase databaseWithPath:@"prosegur.sqlite"];
if([database open]){
    NSLog(@"yes");
    [database executeUpdate:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, UserId) VALUES ('cenas', '2012-02-0',  1, 1, 1)"];}
else
{
    NSLog(@"not");
}
通过[database open]验证,但不执行查询

编辑2:已经按照建议做了,我开始认为它创建了一个数据库并在其中执行查询,但由于它不存在任何表,所以忽略了这一事实

以下是更新的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [[paths objectAtIndex:0] retain];
NSString *path = [[docsPath stringByAppendingPathComponent:@"prosegur.sqlite"] retain];

FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];
if([database open])
{
    NSLog(@"yes");
    [database executeUpdate:@"INSERT INTO CheckList (CLName) VALUES (?)", @"cenas"];
}
else 
{
    NSLog(@"no");
}
[database close]; 

也许这是一个愚蠢的问题,但是您知道
sqlite3\u prepare\u v2
只准备语句而不实际执行它吗?您还需要调用
sqlite3\u step
来实际执行插入


您可以使用
sqlite3\u exec
,它只执行一条语句,而不执行prepare/execute两步操作。

在iOS开发中使用standart sqlite3 api时,我感到非常头痛。 查看框架。它使用起来非常简单,你可以在网上找到很多教程

如果不需要该框架,请尝试使用
NSError
捕获查询执行时的错误

示例

+(BOOL)InsertDataInPin:(NSString *)pin
    {
        NSString *databasePath =Your DatabasePath;

        NSString *SQL=@"INSERT INTO pincode Values(?)";
        sqlite3_stmt *dataset;


        if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK ) {

            if (sqlite3_prepare_v2(database, [SQL UTF8String], -1, &dataset, NULL) == SQLITE_OK) 
            {

                sqlite3_bind_text(dataset, 1, [pin UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_step(dataset);

            }       

            sqlite3_close(database);
        }


    }

我找到了答案,如果有人遇到这样的问题,请查看以下链接:


谢谢大家的支持

我的问题是他没有得到sqlite3_prepare_v2(..)=SQLITE_OK验证,他总是去其他地方。我看不出那句话有什么不对的地方。谢谢,我会试试的,如果我做不到,我真的想用coredata应用程序。谢谢msj!:)您不能使用
NSError
,因为SQLite是C级API,
NSError
是目标C。是我的错。关于FMDB——它是SQLite的包装器。因此,它支持真正的SQL查询,并且比核心数据更易于使用。编辑主题,我想寻求一些帮助,这是一项学术工作:(在提供的代码中,您不使用数据库的实际路径。您应该提供完整路径。这是我获取数据库实际路径的方式:
+(NSString*)databasePath;{NSString*databaseName=@“socialpad.sqlite”;NSArray*DocumentPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);NSString*documentsDir=[documentPaths objectAtIndex:0];NSString*databasePath=[documentsDir stringByAppendingPathComponent:databaseName];返回databasePath;}
[FMDatabase databaseWithPath:@“prosegur.sqlite”];