iphone - 如何在 FMDatabase 中打开外键?

标签 iphone objective-c sqlite fmdb

刚刚偶然发现外键在 sqlite 中默认是禁用的。我有“删除级联”外键并且删除父表记录不会删除子记录。各种帖子表明您需要在每个连接上启用它“PRAGMA foreign_keys = ON;”。那么,在 FMDatabase 的什么地方启用它呢?我宁愿设置一些设置而不是在每个 SQL stmt 之前运行命令。附言。我正在使用 FMDatabaseQueue。

最佳答案

我快速检查了一下,PRAGMA foreign_keys = ON; 在 5.1 模拟器和 5.1 iPod Touch 上对我来说工作正常。正如 ccgus 所建议的,您应该缓存数据库连接。如果您使用队列,只需缓存队列并重新组织您的代码,这样它就不会在您每次需要使用数据库时创建新队列。对于您当前的方法,如果您并不真正使用它而是每次都创建一个队列,那么拥有一个队列有什么意义?

但是回到问题,正如您已经知道的,默认情况下外键是关闭的,因此您需要先启用它。我设法用 PRAGMA foreign_keys = ON; 做到了,这里是我使用的更多测试代码:

//create database
NSString* dbPath = [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
dbPath = [dbPath stringByAppendingPathComponent:@"test.db"];
db = [FMDatabase databaseWithPath:dbPath];
if ([db open]) {
    NSLog(@"Database %@ opened", dbPath);
    //check for foreign_key
    NSString* sql = @"PRAGMA foreign_keys";
    FMResultSet *rs = [db executeQuery:sql];
    int enabled;
    if ([rs next]) {
        enabled = [rs intForColumnIndex:0];
    }
    [rs close];
    if (!enabled) {
        // enable foreign_key
        sql = @"PRAGMA foreign_keys = ON;";
        [db executeUpdate:sql];
        // check if successful
        sql = @"PRAGMA foreign_keys";
        FMResultSet *rs = [db executeQuery:sql];
        if ([rs next]) {
            enabled = [rs intForColumnIndex:0];
        }
        [rs close];
    }
    // do your stuff here, or just cache the connection
} else {
    NSLog(@"Failed to open %@", dbPath);
}

看起来相当简单,唯一想到的是您使用了 executeQuery 而不是 executeUpdate

关于iphone - 如何在 FMDatabase 中打开外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10477836/

相关文章:

objective-c - 沿二次曲线对 View 的中心点进行动画处理

c# - 使用 SQLite 测试 ASP Net Core 应用程序抛出未知函数 : newid()

iphone - 在未知的 NSMutableArray 深度中搜索值

iphone - 分析,泄漏工具导致仪器崩溃

ios - 如何将数字转换为文本?

android - 在 ListView 中单击项目时,如何获取 sqlite 数据库中表的行 ID

Android SQLite ON CONFLICT UPDATE 是可能的吗?

ios - watch 操作系统 : which icon is used in the MyWatch App

iphone - 在ios中设置 "Do not backup flag"的URL是哪个?

ios - 使用 AFNetworking 2 高效下载大量图像(1500+)