Query不会在sqlite中插入值

时间:2014-03-14 22:57:19

标签: ios objective-c sqlite

我有一个困扰我几天的问题。我想要做的就是在方法中添加一个命令' ViewDidLoad'这将使数据输入sqlite,这将使其变得简单,不需要其他字段和按钮,因此,在模拟运行时,新记录将自动插入sqlite中,所以我试试这个:

  1. 在SQLite Manager数据库(firefox中的插件)中,我创建了一个名为“registros'”的新数据库,程序将其保存为“registros.sqlite'
  2. 我创建了这个表:

    CREATE TABLE" main"。" campos" (" id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE," campo1" VARCHAR," campo2" VARCHAR," campo3" VARCHAR)

  3. 在我的项目文件中,我所做的只是创建一个文件,名字是' MYFristViewController'使用xib文件,在'构建阶段'我添加了' libsqlite3.dylib'。在MyFristViewController.m中,我添加了以下代码:

    #import "MyFristViewController.h"
    #import <sqlite3.h>
    
    @implementation MyFristViewController
    
    - (void)viewDidLoad{
    
        [super viewDidLoad];
    
        sqlite3 *db;
    
        NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"registros.sqlite"];
    
        sqlite3_open([dbPath UTF8String], &db);
    
        char *sql = "INSERT INTO campos (campo1,campo2,campo3) VALUES (?,?,?)";
    
        sqlite3_stmt *stmt;
    
        int resultado2 = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
    
        sqlite3_bind_text(stmt, 1, [@"Campo_01" UTF8String], -1,  SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 2, [@"Campo_02" UTF8String], -1,  SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 3, [@"Campo_03" UTF8String], -1,  SQLITE_TRANSIENT);
    
        resultado2 = sqlite3_step(stmt);
    
        sqlite3_finalize(stmt);
    
    }
    
    @end
    

    作为初学者,我不知道还能做什么,我甚至尝试修改命令的第五个参数&#39; sqlite3_bind_text&#39;到SQLITE_STATIC或SQLITE_TRANSIENT,但似乎没有将值添加到数据库中,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

在数据库中创建一个新的寄存器,在.h文件(继承NSObject)中,是否需要导入sqlite3.h,获取数据库的路径:

@interface RegistroCrud : NSObject{
    sqlite3 *bd;
}
-(NSString *) getPathBD;
-(void)newRegister:(NSString *)campo1 campo2:(NSString *)campo2 campo3:(NSString *)campo3;

getPathDB方法是在退出时获取数据库,如果不退出则创建它

在.m文件中

-(NSString *)getPathBD
{
    NSString *dirDocs;
    NSArray *rutas;
    NSString *rutaBD;
    rutas = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    dirDocs = [rutas objectAtIndex:0];

    NSFileManager *fileMgr = [NSFileManager defaultManager];
    rutaBD = [[NSString alloc] initWithString:[dirDocs       
    stringByAppendingPathComponent:@"registros.sqlite"]];

    if([fileMgr fileExistsAtPath:rutaBD] == NO){
        [fileMgr copyItemAtPath:[[[NSBundle     mainBundle]resourcePath]stringByAppendingPathComponent:@"registros.sqlite"] toPath:rutaBD error:NULL
         ];
    }
    return rutaBD;
    }

-(void)newRegister:(NSString *)campo1 campo2:(NSString *)campo2 campo3:(NSString *)campo3
{
    NSString *pathDB = [self getPathBD];
    if(!(sqlite3_open([pathDB UTF8String], &bd) == SQLITE_OK)){
        NSLog(@"No se puede conectar con la BD");
        return;
    } else {
        NSString *sqlInsert = [NSString stringWithFormat:@"INSERT OR IGNORE INTO campos (campo1,campo2,campo3) VALUES (%@,%@,'%@')",campo1,campo2,campo3];
        const char *sql = [sqlInsert UTF8String];
        sqlite3_stmt *sqlStatement;
        if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) != SQLITE_OK){
            NSLog(@"Problema al preparar el statement");
            return;
        } else {
            if(sqlite3_step(sqlStatement) == SQLITE_DONE){
                sqlite3_finalize(sqlStatement);
                sqlite3_close(bd);
            }
        }
    }
}

您是否需要在项目中使用registros.sqlite

有一个西班牙语教程:http://www.imaginaformacion.com/tutoriales/crear-una-aplicacion-con-sql-lite-en-ios-5-parte-i/使用sqlite在ios数据库中创建crud,;)

答案 1 :(得分:0)

我尝试了很多东西,但没有得到任何结果,在这里我随身携带我的项目文件:

www.fazerbem.com.br/TesteUltimoSql.zip