【问题标题】:How do I add files to the resources folder in XCode?如何将文件添加到 XCode 中的资源文件夹?
【发布时间】:2011-06-28 21:22:00
【问题描述】:

我想向 XCode 4 添加一个 sqlite 数据库(也适用于 XCode 3)。教程状态将 .db 文件添加到资源文件夹,我想这会在构建期间被复制到 ~/Library/Application Support/iPhone Simulator/4.2/Applications/{some-id}/Documents/在哪里可以找到带有NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 的文件 等等

但是,XCode 4 没有可见的资源文件夹。

我尝试使用 Add File... 命令添加文件,然后它出现在 Targets > AppName > Copy Bundle Resources 中,但在上面的文档文件夹中总是出现一个空的 .db 文件(然后我手动替换 - 显然不是正确的方法!)

(由于数据的性质,我坚持使用 sqlite 而不是 CoreData)

【问题讨论】:

    标签: iphone xcode sqlite xcode4


    【解决方案1】:

    你必须开始在你的 project-xcode 中添加你的数据库,所以它会被添加到你的 bundle 文件夹中,你可以在其中通过代码找到它:

    [NSBundle mainBundle]
    

    它是您在“构建”应用程序时可以通过 xcode 添加文件的唯一文件夹(最终使用子文件夹,但不是“系统”文件夹作为“文档”)现在您只需要记住主捆绑文件夹只是“只读”,因此您不能在那里使用具有写权限的数据库。 所以正常的方式是:

    1) 当你想使用你的数据库时,通过代码检查它是否存在于 app:documents 文件夹中。 当然第一次没有,所以

    2) 从主包中复制它

    - (BOOL)transferDb {
        NSError **error;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourData.db"]; 
    
        NSFileManager *fileManager = [NSFileManager defaultManager];
    
        if (![fileManager fileExistsAtPath: path])
        {
            NSString *bundle =  [[ NSBundle mainBundle] pathForResource:@"preferenze" ofType:@"plist"];
            [fileManager copyItemAtPath:bundle toPath:path error:error];
            return YES;
        }
        return NO;
    }
    

    3) 在文档文件夹中使用它(r/w)

    ps: 并且(当然)请记住,当您在 iPhone/模拟器中使用/编辑/编写数据库时,可能会添加记录,主包中的那个,当然您的 mac/项目中的那个不会更新,不记录将被添加到其中,因此如果出于任何原因您在 iPhone/模拟器上删除了您的应用程序(或通过 xCode“构建”菜单“清除所有目标”),检查/复制方法将复制文档中的“处女”数据库再次文件夹,所以你将丢失所有更改...

    【讨论】:

    • 我想问一下这段代码是否仍然适用于 IOS 8 和 Yosemite,因为 SQLite 文件的位置发生了变化
    【解决方案2】:

    注意您放入 Documents 文件夹的数据量,这是用于用户数据的,因为这些数据将使用 iCloud 进行备份,Apple 限制了应用程序可以在 Documents 中存储和使用的数据量文件夹。

    我的应用因以这种方式使用 6MB SQLite 数据库而被拒绝。而是将其复制到缓存目录:NSCachesDirectory。

    或者阻止文件被备份:https://developer.apple.com/library/ios/#qa/qa1719/_index.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2016-12-29
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多