Cora Data - iOS 7 上关于 Raywenderlich.com 中 How to Preload and Import Existing Data 的注解

本文针对iOS使用CoreData时出现的SQLite数据库问题提供了解决方案。通过调整journal_mode设置为DELETE,确保数据库文件正常创建且仅包含所需文件,避免额外的SQLite WAL和SHM文件干扰。

在 Ray的教程中关于Core Data的第2篇文章中有一个问题一直没有被更新:在iOS 7下,如果你按照作者所述写完代码并运行,编译没有问题,但你会发现在最终结果的文件夹中不知有作者所说的4个文件,还有个xxxx.sqlit-wal 和 xxxx.sqlit-shm,然后用 SQLITE 的viewer 打开,数据库空一片片片。。。


原因,在这:https://developer.apple.com/library/ios/releasenotes/DataManagement/WhatsNew_CoreData_iOS/#//apple_ref/doc/uid/TP40013394-CH1-SW1

那就解决吧,在 managedObjectContext() 函数中做如下更改:(21,22,23 行),然后运行,去文件夹中看看,现在只有一个xxxx.sqlite文件了!!!

static NSManagedObjectContext *managedObjectContext()
{
    static NSManagedObjectContext *context = nil;
    if (context != nil) {
        return context;
    }

    @autoreleasepool {
        context = [[NSManagedObjectContext alloc] init];
        
        NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel()];
        [context setPersistentStoreCoordinator:coordinator];
        
        NSString *STORE_TYPE = NSSQLiteStoreType;
        
        NSString *path = [[NSProcessInfo processInfo] arguments][0];
        path = [path stringByDeletingPathExtension];
        NSURL *url = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"sqlite"]];
        
        NSError *error;
        NSDictionary *dict = @{@"journal_mode":@"DELETE"};
        NSDictionary *opts = @{NSSQLitePragmasOption:dict};
        NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE configuration:nil URL:url options:opts error:&error];
        
        if (newStore == nil) {
            NSLog(@"Store Configuration Failure %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
        }
    }
    return context;
}


<think>好的,用户遇到了“No such file or directory './data\in.cora.x'”的错误,需要解决这个问题。首先,我需要根据提供的引用信息和常见解决方法进行分析。 用户提到的路径是'./data\in.cora.x',这里混合了正斜杠和反斜杠,可能在Windows系统中导致问题。根据引用[2]和[3],相对路径的正确写法很重要。用户可能在Windows环境下运行代码,而路径中的反斜杠可能需要转义或替换为正斜杠。此外,检查文件是否存在是关键步骤。 接下来,用户需要确认当前工作目录是否正确。引用[2]提到相对路径的层级关系,比如'./data'表示当前目录下的data文件夹。如果脚本不是在项目根目录运行,路径可能不正确。建议用户打印当前工作目录,并检查文件的实际位置。 另外,绝对路径是一个可靠的替代方案,可以暂时使用绝对路径来测试是否存在权限或路径错误。如果绝对路径有效,说明相对路径的配置有问题,用户需要调整路径结构或使用os模块处理路径。 还有可能文件命名不正确或文件扩展名有误,比如'in.cora.x'是否实际存在,或者是否有拼写错误。用户需要仔细核对文件名和扩展名。 总结解决方案步骤:检查路径分隔符、确认工作目录、验证文件是否存在、使用绝对路径测试、检查文件名正确性,以及处理可能的权限问题。同时,根据引用[4],确保打开文件时的模式正确,比如使用'rb'可能需要处理二进制文件,但此处可能不相关,不过还是需要确认文件类型。 最后,提供代码示例帮助用户动态构建路径,并建议异常处理来捕获更多错误信息。这样用户能逐步排查问题,找到根本原因。</think>针对`FileNotFoundError: [Errno 2] No such file or directory './data\in.cora.x'`错误,按以下步骤排查: --- ### 1. **路径分隔符问题** Windows系统中路径应统一用**正斜杠`/`**或**双反斜杠`\\`**。混合使用会导致解析失败: ```python # 错误写法(混合斜杠) 错误路径 = './data\in.cora.x' # 反斜杠\在字符串中会转义 # 正确写法(统一正斜杠) 正确路径 = './data/in.cora.x' # 或使用原始字符串(推荐) 正确路径 = r'./data\in.cora.x' # r前缀表示不转义 ``` --- ### 2. **检查文件实际位置** 通过代码打印**当前工作目录**和**完整路径**: ```python import os # 打印当前工作目录(代码运行时所在的目录) print("当前工作目录:", os.getcwd()) # 示例输出:C:\project\ # 拼接完整路径并验证是否存在 目标路径 = os.path.join(os.getcwd(), 'data', 'in.cora.x') print("完整路径:", 目标路径) print("文件存在?", os.path.exists(目标路径)) ``` - 若输出`False`,说明路径层级错误(参考引用[2]的目录层级说明) - 文件应位于`<当前工作目录>/data/in.cora.x` --- ### 3. **相对路径与绝对路径测试** **临时使用绝对路径**验证文件是否存在: ```python 绝对路径 = 'C:/your_project/data/in.cora.x' # 替换为实际路径 with open(绝对路径, 'r') as f: print("文件打开成功") ``` - 若成功,说明相对路径配置错误 - 若失败,检查文件权限/文件名拼写(引用[3]) --- ### 4. **动态路径构建技巧** 使用`os.path`模块避免路径硬编码: ```python import os # 获取脚本所在目录(更稳定的基准路径) 脚本目录 = os.path.dirname(os.path.abspath(__file__)) 目标路径 = os.path.join(脚本目录, 'data', 'in.cora.x') ``` --- ### 5. **常见错误场景** | 场景 | 表现 | 解决方案 | |------|------|----------| | 工作目录错误 | VSCode默认以打开文件夹为工作目录 | 修改`.vscode/settings.json`配置[^2] | | 文件名大小写 | Linux系统区分大小写 | 检查`in.cora.x`与`In.Cora.X`差异 | | 文件扩展名隐藏 | 实际文件名为`in.cora.x.txt` | 关闭系统"隐藏已知扩展名"选项 | --- ### 6. **异常处理增强** 添加详细错误日志: ```python try: with open('./data/in.cora.x', 'r') as f: pass except FileNotFoundError as e: print(f"错误详情:{e}") print("建议检查:") print("- 当前工作目录:", os.getcwd()) print("- 路径拼接结果:", os.path.join(os.getcwd(), 'data/in.cora.x')) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值