设置persistentStoreDescriptions不会导致保存CoreData对象

时间:2017-03-29 19:17:39

标签: ios swift core-data swift3

我正在尝试确保使用Data Protection保护所有CoreData。当我尝试在容器上设置NSPersistentStoreDescription时,不保存任何CoreData对象。如果我注释掉下面指出的行,则保存(并读取)所有对象就好了。如果我启用该行,则不会保存任何内容(或者读取静默失败?)。没有生成错误,也没有生成日志。我的配置文件中有数据保护权利(匹配completeUnlessOpen)。我必须遗漏一些非常基本的东西。

这是Xcode 8.2.1(8C1002)

任何人都可以提供任何见解/建议吗?

%PDF-1.7
%¥±ë

1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 /MediaBox [0 0 200 200] >> endobj
3 0 obj << /Type /Page /Parent 2 0 R /Resources 5 0 R /Contents 4 0 R >> endobj

4 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Hello World) Tj ET
endstream
endobj

5 0 obj << /Font << /F1 << /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> >> >> endobj
6 0 obj << /Fields [ 7 0 R ] /DR 5 0 R >> endobj
7 0 obj << /FT /Btn /Ff 65536 /Kids [ 8 0 R 9 0 R ] >> endobj
8 0 obj << /Parent 7 0 R /AS /FieldA /AP 10 0 R >> endobj
9 0 obj << /Parent 7 0 R /AS /FieldB /AP 10 0 R >> endobj
10 0 obj << /N << /FieldA 11 0 R /FieldB 12 0 R /Off 13 0 R >> >> endobj

11 0 obj << /Length 59 >>
stream
BT /F1 12 Tf 0 0 Td (Field A) Tj ET
endstream
endobj

12 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Field B) Tj ET
endstream
endobj

13 0 obj << /Length 39 >>
stream
BT /F1 12 Tf 0 0 Td (Off... ) Tj ET 94
endstream
endobj

xref
0 14
0000000000 65535 f 
0000000018 00000 n 
0000000068 00000 n 
0000000150 00000 n 
0000000233 00000 n 
0000000327 00000 n
0000000420 00000 n
0000000470 00000 n
0000000533 00000 n
0000000592 00000 n
0000000651 00000 n
0000000727 00000 n
0000000821 00000 n
0000000917 00000 n
trailer << /Root 1 0 R /Size 5 >>
startxref
1013
%%EOF

2 个答案:

答案 0 :(得分:0)

您的错误实际上是因为您正在设置与核心数据相关的选项。文件保护在class Program { public class A { } public static A Map(dynamic x) { return new A(); } static void Main(string[] args) { IEnumerable<dynamic> d = new dynamic[] { }; // OK IEnumerable<A> a1 = d.Select(Map); // OK IEnumerable<A> a2 = d.Select(x => (A)Map(x)); // NOT OK // Cannot implicitly convert type 'IEnumerable<dynamic>' to 'IEnumerable<A>' IEnumerable<A> a3 = d.Select(x => Map(x)); } } FileManager函数调用下完成。

但是,基本问题的答案是您不需要为单个文件添加文件保护 - 它们被设置为您在权利中声明的默认保护。

这可以通过打印输出来验证:

setAttributes

答案 1 :(得分:0)

我知道这个问题很久以前就有人问过了,但我仍然会发布一个答案,以便任何陷入这个问题的人都能得到一些帮助。

在您在问题中发布的上述代码片段中,您没有使用 SQLITE 文件 URL 初始化 NSPersistentStoreDescription

所以,它不知道它代表什么持久化容器。请参考以下工作代码。

    let container = NSPersistentContainer(name: "AppName")

    if let storeDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first {
        let slqiteURL = storeDirectory.appendingPathComponent("AppName.sqlite")
        
        //Set Protection for Core data sql file
        let description = NSPersistentStoreDescription(url: slqiteURL)
        description.shouldInferMappingModelAutomatically = true
        description.shouldMigrateStoreAutomatically = true
        description.setOption(FileProtectionType.complete as NSObject, forKey: NSPersistentStoreFileProtectionKey)
        container.persistentStoreDescriptions = [description]
    }
    
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in...}

让我知道这是否适合您,如果可以,请接受答案,以便其他人知道。