【问题标题】:Storing data in SQLite database after closing session in iPhone app在 iPhone 应用程序中关闭会话后将数据存储在 SQLite 数据库中
【发布时间】:2011-03-08 21:16:46
【问题描述】:

我正在使用 Objective-C 构建一个 iPhone 应用程序,该应用程序将数据存储在 SQLite 数据库中。我遇到的问题是,当我的应用程序运行时,我能够对表中的数据进行某些更改。具体来说,我需要允许用户单击一个按钮并从列表中选择某些餐厅作为“最喜欢”(真)或“不喜欢”(假)。

当我的模拟器运行时,代码运行良好。但是,当我关闭会话并重新启动应用程序时,我在上一个会话中所做的更改不会保存。这是相关的代码块:

- (void) addFavourite:(NSString *)rName{


sqlite3 *database;

NSString *updateString = nil;
NSString *trueStatement = @"true";

NavButtonAppDelegate *delegate = [[UIApplication sharedApplication] delegate];

if (sqlite3_open([delegate.databasePath UTF8String], &database) == SQLITE_OK) {

    updateString = @"UPDATE gtarestaurant set isFavourite = ? WHERE name = ?";
    const char *sqlStatement = [updateString UTF8String];
    sqlite3_stmt *compiledStatement;

    if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

        sqlite3_bind_text(compiledStatement, 1, [trueStatement UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compiledStatement, 2, [rName UTF8String], -1, SQLITE_TRANSIENT);


        while (sqlite3_step(compiledStatement) == SQLITE_ROW) {


        }

        sqlite3_finalize(compiledStatement);


    }

    sqlite3_close(database);

}

}

谁能看出我哪里出错了?看来我的问题是在用户进行更改后将更改提交到数据库

【问题讨论】:

  • 你在哪里加载数据库?您是在代码中创建它还是复制资源文件?我怀疑您可能正在覆盖您的数据库,请发布该代码。

标签: iphone objective-c database sqlite


【解决方案1】:

用途:

if(SQLITE_DONE != sqlite3_step(compiledStatement))
    NSAssert1(0, @"Update error: '%s'", sqlite3_errmsg(database));

代替:

    while (sqlite3_step(compiledStatement) == SQLITE_ROW) {


    }

更新失败的原因有很多,例如表不存在或字段名称拼写错误。这应该会给你一个错误,告诉你为什么更新没有处理。如果您不希望应用停止使用 NSLog 而不是 NSAssert。

另外:你应该有一个 else 语句加上你的 if (sqlite3_open()) 来通知你或用户数据库没有正确打开。

【讨论】:

  • 非常感谢您的及时回复。我的代码没有产生任何错误。相反,正如我之前所说,我对数据库所做的更改并没有提交到用户的会话。我尝试实施您的解决方案,不幸的是我的问题仍然存在。我怀疑这个问题可能与我如何完成我的陈述有关。会是这样吗?再次感谢您的帮助。
  • 您是否正在检查数据库本身以确保您的更改确实在进行?只要您不从模拟器中删除应用程序,数据库就应该维护更改。如果您确定在调用该方法后数据库实际上正在更改,则可能是您的代码在其他地方覆盖了数据库。
  • 再次感谢您的及时回复。我做了更多测试,发现我的应用程序永远不会超过以下代码行: if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 你明白为什么会这样吗?我检查了数据库,当我从 sqlite 控制台检查时没有进行更新,这证实了我的发现。换句话说,这些更改永远不会写入表中。你看到有什么问题吗?再次感谢您的帮助。
  • 同样的处理,在 if 语句之后添加一个 else 语句:'NSAssert1(0, @"Error: '%s'", sqlite3_errmsg(database));'这应该会为您输出更多信息。
【解决方案2】:

非常感谢您提供的所有解决方案。我发现问题在于我认为我对 SQLite 表所做的更改没有通过,因此我的代码从未向表写入任何更新。实际上,我必须通过数据库浏览器对 iPhone 模拟器作为应用程序一部分使用的数据库的位置进行更改,以便代码正确处理更新。非常感谢 Deepmist 和 theChrisKent 花时间发布您的解决方案。对此,我真的非常感激。保重。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2012-07-29
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多