【问题标题】:Query doesn't insert values in sqlite查询不会在 sqlite 中插入值
【发布时间】:2014-04-20 11:13:08
【问题描述】:

我有一个问题困扰了我好几天。我要做的就是在方法'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)

在我的项目文件中,我所做的只是使用 xib 文件创建一个名为“MYFristViewController”的文件,在“构建阶段”中添加“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

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

【问题讨论】:

  • 您需要检查sqlite3_opensqlite3_prepare_v2sqlite3_step的返回值。此外,最好使用sqlite3_open_v2 而不是旧的sqlite3_open。此外,应用程序的捆绑包是只读的。你不能在那里写文件,所以你需要在你的应用程序第一次运行时把你的数据库文件放在一个可写的位置。
  • 如果返回代码之一不是“好”,则记录sqlite3_errmsg() 的值。 SQLite 中的错误报告非常好,但您必须实际使用它。
  • 一般CREATE TABLE应该是CREATE TABLE IF NOT EXIST,这样你第二次访问数据库就不会出错了。
  • 另外,要了解如何使用 SQLite 并测试您的查询,请在命令窗口中使用sqlite3 OSX 命令来打开和操作测试文件。该命令还可用于检查您在模拟器中创建的 DB 文件的内容。

标签: ios objective-c sqlite


【解决方案1】:

在数据库中新建一个寄存器,在.h文件(继承的NSObject)中,是否需要import 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,;)

【讨论】:

  • 我在控制台'Problema al preparar el statement'上遇到错误,我在我放入的.h文件中继续'MyFristController.h/.m/.xib',其余的都是一样的......
  • AAAH 在方法 viewDidLoad 中的 .m 文件中我把这段代码:[self getPathBD]; [self newRegister:@"ws" campo2:@"gh" campo3:@"fg"];
  • 你是否需要创建一个新类(即:registroCrud),继承自NSObject并在你的viewController中导入这个类(即:#import "registroCrud.h"),并在其中创建新的寄存器数据库:registroCrud *register = [[registroCrud alloc]init]; [注册新注册:@"campo1"campo2:@"campo2"campo3:@"campo3"];
  • 这里是项目文件:www.fazerbem.com.br/TesteUltimoSql.zip
【解决方案2】:

我尝试了很多东西但没有得到任何结果,这里我将我的项目文件留给你:

www.fazerbem.com.br/TesteUltimoSql.zip

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多