【发布时间】: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(),那么如果应用程序在没有调用的情况下终止,则可能存在一些缓存永远不会被刷新完成()...