【问题标题】:sqlite delete problem on iPhoneiPhone上的sqlite删除问题
【发布时间】:2009-06-22 10:28:02
【问题描述】:

在我的 iPhone 应用程序中,我试图从 SQLite 数据库中删除一行。执行删除语句后,该行似乎被正确删除,但在我重新启动应用程序后,该行仍然存在。 我正在使用代码打击来删除记录。知道可能是什么问题吗?

NSString *deleteSQL = [NSString stringWithFormat:@"DELETE FROM table1 WHERE actId=%d", actId];

char *errorMsg;

if (database == nil) {
    NSLog(@"ERROR db not initialized but trying to delete record!!!");
}else{
    if (sqlite3_exec(database, [deleteSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK){
        NSAssert1(0, @"Error updating tables: %s", errorMsg);
        sqlite3_free(errorMsg);
        return NO;
    }   
}

NSLog([NSString stringWithFormat:@"DELETE Successful"]);

【问题讨论】:

  • 您是否将数据库复制到可写区域,或者您是否尝试写入沙盒区域?另外,只是为了让您知道,您的断言失败会杀死您的执行路径,但 UIApplication 实际上会继续,基本上是内存泄漏。请改用 NSLog 或 asl_log 或确保在发布时编译出断言。
  • 数据库必须在可写的地方,因为sql语句确实在同一个表上工作。我应该以某种方式“承诺”以使更改持续存在吗?感谢您提供有关断言的提示。
  • @levi - 这根本不是真的。 iPhone 使用沙盒,因此文件看起来可以在可写的地方,但这些更改只发生在内存中。当应用程序终止时,设备上不会保留任何实际更改。您在哪里创建了这个数据库?
  • 但是插入工作怎么可能,而删除却不行呢?当应用程序启动时,我正在检查 db 文件是否可用,如果没有,我将其复制到那个地方。使用以下方法确定路径: - (NSString *) dataFilePath:(NSString *)fileName { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0];返回 [documentsDir stringByAppendingPathComponent:fileName]; }
  • 哦,很高兴你解决了它!如果您使用的是准备好的语句,则必须调用 sqlite3_reset() 或 sqlite3_finalize(),这是强制性的 :) 如果您正在调用 reset(),那么如果应用程序在没有调用的情况下终止,则可能存在一些缓存永远不会被刷新完成()...

标签: iphone database sqlite


【解决方案1】:

我已经解决了这个问题。虽然我并不完全了解所有细节。问题是在我的“加载代码”中,我忘记为语句调用 sqlite3_finalize。不知道为什么,但这会以某种方式影响未来的插入和删除。在数据加载方式中加入 sqlite3_finalize 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多