【问题标题】:How to insert an array into a SQLite database?如何将数组插入 SQLite 数据库?
【发布时间】:2011-09-08 00:55:57
【问题描述】:

我正在尝试将数组插入 SQLite 数据库,但在插入要插入的数组变量时遇到了困难。

如何从数组(用户名和全名)中获取变量以插入数据库?

以下是错误消息:

Property 'username' not found on object of type 'NSString *'
Property 'fullName' not found on object of type 'NSString *'

这是我的代码...

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

    NSMutableArray *items = result;

    sqlite3_stmt *insert_statement;

    // prepare the insert statement
    const char*sql = "INSERT INTO people (username, fullName) VALUES(?,?)"; 
    sqlite3_prepare_v2(database, sql, -1, &insert_statement, NULL);

    // iterate over an array of dictionaries
    for (NSString *str in items) {

        // NSLog(@"%@",str);

        // bind variables
        sqlite3_bind_text(insert_statement, 1, [str.username UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insert_statement, 2, [str.fullName UTF8String], -1, SQLITE_TRANSIENT);

        // insert fails
        if (sqlite3_step(insert_statement) != SQLITE_DONE) {
            NSLog(@"Insert failed: %s", sqlite3_errmsg(database));
        }

        // reset the statement
        sqlite3_reset(insert_statement);
    }

    // release the statement
    sqlite3_finalize(insert_statement);
}`

【问题讨论】:

  • 对于它的价值,我强烈建议使用像 FMDBPLDatabase 这样的 Objective-C sqlite 包装器 - 它会让你的生活更轻松
  • 首先,您的代码在从数组中获取用户名和全名时存在错误。我们可以看到以后从未使用过的“str”对象。所以修复您的问题代码,我们可以提供帮助)。到目前为止,您在 sqlite 部分的代码看起来不错。插入前是否成功打开数据库?
  • 您收到的错误信息是什么?在此处发布项目声明。你如何创建项目数组?您是否收到错误消息“插入失败:”。?如果是,那么您的数据库句柄设置正确。少一件需要担心的事情。
  • @crypticcoder 我已经编辑了问题并包含了上面的错误消息。当我尝试声明变量 (str.username & str.fullName) 时出现问题。
  • 是的,凯文,你的问题现在很明显了。您如何期望作为 NSString* 的 str 为您提供 str.username 和 str.fullname。 str 是一个类似于“Kevin”的 NSString。它不是一个可以像 str.fullname 那样使用的结构。这是第 1 部分。您现在应该告诉我您的全名和用户名列表在哪里。你如何构建它们?

标签: iphone ios sqlite


【解决方案1】:

此代码与启动事务并提交它结合使用效果很好:

// start transaction
sqlite3_stmt *begin_transaction_stmt;
const char *beginTrans = "BEGIN EXCLUSIVE TRANSACTION";

if (sqlite3_prepare_v2(database, beginTrans, -1, &begin_transaction_stmt, NULL) != SQLITE_OK) {
    sqlite3_close(database);
    return NO;
}

sqlite3_step(begin_transaction_stmt);
sqlite3_finalize(begin_transaction_stmt);

========== [您上面帖子中的代码在这里] =============

// commit transaction
sqlite3_stmt *end_transaction_stmt;
const char *endTrans = "COMMIT";
if (sqlite3_prepare_v2(database, endTrans, -1, &end_transaction_stmt, NULL) != SQLITE_OK) {
    sqlite3_close(database);
    return NO;
}

sqlite3_step(end_transaction_stmt);
sqlite3_finalize(end_transaction_stmt);

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多