【问题标题】:Core Data "do not backup" flagCore Data“不备份”标志
【发布时间】:2013-01-24 11:58:21
【问题描述】:

我的应用有一个核心数据数据库,它在首次启动时填充以供离线使用。然后,该数据库在每次启动时与在线数据库同步。只有第一次启动包含大量数据。该应用程序还从网络上获取一些图像,然后将其转换为二进制数据并保存到核心数据以供离线使用。这只发生在用户导航到包含一些图像的部分时,并且仅获取这些图像(应用不会一次获取所有图像,仅在需要时获取)。

我正在使用魔法唱片。

我不会在运行时将任何类型的数据保存到文件中。但是我的应用被这条消息拒绝了:

我们发现您的应用未遵循 App Store 审核指南所要求的 iOS 数据存储指南。

它建议我检查“设置 > iCloud > 存储和备份 > 管理存储”,但我的应用程序甚至没有显示。

我知道我应该将核心数据标记为不备份到 iCloud,但我不明白如何执行此操作。假设我应该实现这样的东西,但不知道如何将它应用到我的核心数据文件中。

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                              forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
    NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success; }

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    下面可能比更改 MacigalRecord 的源文件更好。 很快

    MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("somedb.sqlite")
    let dbPath = NSPersistentStore.MR_urlForStoreName("somedb.sqlite")
    do {
      try dbPath.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey)
    } catch let error {
        print(error)
    }
    

    【讨论】:

    • 这是要走的路。对于 Objective C 的人:NSURL * dbURL = [NSPersistentStore MR_urlForStoreName:@"storename"]; NSError *error = nil; BOOL success = [dbURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    • 我建议从备份中排除整个目录,而不仅仅是.sqlite。否则日志数据库文件将包含在备份中。如果我记得很清楚,MagicalRecord 默认会在 Application Support 中创建一个目录,用于存储所有数据库。所以最好排除这样的一个级别:let dbPath = NSPersistentStore.MR_urlForStoreName(storeFileName).URLByDeletingLastPathComponent
    • if let dbPath = NSPersistentStore.MR_urlForStoreName(storeFileName).URLByDeletingLastPathComponent { do { try dbPath.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey) } catch let error { print(error) } }
    【解决方案2】:

    查找:NSPersistentStoreCoordinator+MagicalRecord.m

    然后,找到:

    - (NSPersistentStore *)MR_addSqliteStoreNamed:(id)storeFileName withOptions:(__autoreleasing NSDictionary *)options
    

    在方法的底部,你会看到:

    if (!store) 
    {
        [MagicalRecord handleErrors:error];
    }
    

    将其更改为:

    if (!store) 
    {
        [MagicalRecord handleErrors:error];
    }
    else
    {
        [self addSkipBackupAttributeToItemAtURL:url];
    }
    

    如果该方法对您来说看起来不同,请告诉我,但这是我在自己的实现中使用的方法。只需确保加入您在问题中提到的功能即可。

    【讨论】:

    • 如果 MagicalRecord 被用作 Pod,在我们为这个 Pod 拉取更新时,它不会被覆盖吗?
    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 2012-08-05
    • 2017-04-20
    • 1970-01-01
    • 2011-06-10
    • 2021-12-05
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多