【问题标题】:SQLite insert from objective c从目标 c 插入 SQLite
【发布时间】:2012-08-27 13:46:34
【问题描述】:

我正在尝试使用目标 c 插入 sqlite 数据库, 以下是我的代码:

-(void)insertCustomer:(CustomerDetails *)cd{

CustomerDetails *cDetails=[[CustomerDetails alloc] initWithIdNumber:cd.idNumber name:cd.name surname:cd.surname];

NSString *name= cDetails.name;
NSString *surname=cDetails.surname;
NSString *idNumber=cDetails.idNumber;


NSString *insertQuery=[NSString stringWithFormat:@"INSERT INTO CUSTOMER_DETAILS(Name,Surname,ID_Number) VALUES(?,?,?);"];
sqlite3_stmt *insertStatement;
sqlite3_prepare_v2(database, [insertQuery UTF8String], 1, &insertStatement, NULL);

sqlite3_bind_text(insertStatement, 1,[name UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 2,[surname UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(insertStatement, 3,[idNumber UTF8String], -1, SQLITE_TRANSIENT);

sqlite3_step(insertStatement);
sqlite3_finalize(insertStatement);
sqlite3_close(database);

}

这并没有插入任何东西,当我调试 insertStatement 时似乎也为空 我是目标 c 的新手,所以会很感激任何帮助:)

谢谢

【问题讨论】:

    标签: objective-c sql sqlite


    【解决方案1】:

    sqllite3_prepare_v2的第三个参数是从SQL语句中读取的字节数。由于您传递了 1,因此读取了一个字节,换句话说,您正在尝试执行 SQL 语句 "I"。这是行不通的,sqllite_prepare_v2 可能会失败,因此没有为insertStatement 分配任何东西 - 但由于您没有检查错误代码的返回值,您的代码将继续运行。

    您可以传递 -1 以使准备函数读取到 UT​​F8 字符串的空终止符为止。换句话说,这应该有效:

    sqlite3_prepare_v2(database, [insertQuery UTF8String], -1, &insertStatement, NULL);
    

    此外,在代码中使用 sqllite API 时,您确实应该检查错误;这可能会避免或解释未来的其他问题。根据文档:

    成功时,sqlite3_prepare() 系列例程返回 SQLITE_OK; 否则返回错误码。

    【讨论】:

    • 你是对的,插入语句现在似乎有一个值,但是表中仍然没有插入任何内容,不确定它可能是什么,我可以尝试按照你说的做一些检查以找出什么它是
    • 我需要做某种提交吗?因为当我在同一个会话中插入相同的数据时,它会给我一个插入错误,我认为这是唯一的约束
    • 您的代码应该可以这样工作,但也许我遗漏了一些东西。您是否尝试过检查 sqlite_stepsqlite_finalize 的返回码?他们有告诉你什么吗?
    • step 返回 101,finalize 返回 0,这些代码有什么意义吗?谢谢
    • 101 是 SQLLITE_DONE,所以这一步应该没问题。
    猜你喜欢
    • 2011-12-13
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多