首页 文章

SQLite3(iOs)查询未执行

提问于
浏览
3

我是iPhone开发人员的新手 .

我有点麻烦让这个工作 .

这是我想要执行的代码:

[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");
}
}

提前致谢,

鲁道夫马托斯

Edit: 试图使用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");
}

通过[数据库打开]验证,但它不执行查询 . 有什么建议吗?谢谢!

EDIT 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];

再次感谢! :)

4 回答

  • 0

    也许是一个愚蠢的问题,但你知道 sqlite3_prepare_v2 只准备声明而不实际执行它?你还需要调用 sqlite3_step 来实际插入,

    您可以使用 sqlite3_exec ,它只执行一个语句而不执行准备/执行两步 .

  • 1

    在iOS开发中使用标准sqlite3 api时我遇到了很多麻烦 . 查看FMDB框架 . 它使用起来非常简单,您可以在网上找到很多教程 .

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

  • 2

    示例示例 .

    +(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);
            }
    
    
        }
    
  • 2

    我找到了答案,如果有人遇到这样的麻烦,请查看以下链接:IPhone Development - Failed to use SQLite

    感谢大家的支持!

相关问题