【问题标题】:Persisting bookmark in core-data在核心数据中保留书签
【发布时间】:2014-07-30 01:54:21
【问题描述】:

我有一个 OSX 应用程序,它应该包含用户磁盘中任何位置的文件列表。

应用的第一个版本将这些文件的路径保存在核心数据模型中。

但是,如果文件被移动或重命名,该工具将失去作用,应用程序可能会崩溃。

所以我决定使用书签。它似乎正在工作,但每次我尝试恢复数据时,我都会得到文件的旧路径。这是为什么?我错过了什么?

我的核心数据实体使用二进制数据字段来保存书签。

书签本身是这样完成的:

NSData * bookmark = [filePath bookmarkDataWithOptions:NSURLBookmarkCreationMinimalBookmark
                       includingResourceValuesForKeys:NULL
                                        relativeToURL:NULL
                                                error:NULL];

在加载应用程序时,我有一个循环来迭代所有表并恢复书签,如下所示:

while (object = [rowEnumerator nextObject]) {
    NSError * error = noErr;
    NSURL * bookmark = [NSURL URLByResolvingBookmarkData:[object fileBookmark]
                                                 options:NSURLBookmarkResolutionWithoutUI
                                           relativeToURL:NULL
                                     bookmarkDataIsStale:NO
                                                   error:&error];
    if (error != noErr)
        DDLogCError(@"%@", [error description]);

    DDLogCInfo(@"File Path: %@", [bookmark fileReferenceURL]);
}

如果我重命名文件,则路径为空。我认为存储此 NSData 对象和带有路径的字符串之间没有区别。所以我显然错过了一些东西。

编辑: 我也经常收到这样的错误:CFURLSetTemporaryResourcePropertyForKey failed because it was passed this URL which has no scheme

感谢您的帮助,谢谢!

【问题讨论】:

    标签: objective-c macos cocoa core-data path


    【解决方案1】:

    我在我的代码中找不到任何问题,所以我更改了它。

    在查找“无方案”消息的原因后,我得出结论,此代码需要一些第三方应用程序才能工作,这是不可取的。

    我现在使用别名。这就是我创建它们的方式:

    FSRef fsFile, fsOriginal;
    AliasHandle aliasHandle;
    NSString * fileOriginalPath = [[filePath absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    OSStatus status = FSPathMakeRef((unsigned char*)[fileOriginalPath cStringUsingEncoding: NSUTF8StringEncoding], &fsOriginal, NULL);
    status = FSPathMakeRef((unsigned char*)[fileOriginalPath cStringUsingEncoding: NSUTF8StringEncoding], &fsFile, NULL);
    OSErr err = FSNewAlias(&fsOriginal, &fsFile, &aliasHandle);
    NSData * aliasData = [NSData dataWithBytes: *aliasHandle length: GetAliasSize(aliasHandle)];
    

    现在我恢复这样的路径:

    while (object = [rowEnumerator nextObject]) {
        NSData * aliasData = [object fileBookmark];
        NSUInteger aliasLen = [aliasData length];
        if (aliasLen > 0) {
            FSRef fsFile, fsOriginal;
            AliasHandle aliasHandle;
            OSErr err = PtrToHand([aliasData bytes], (Handle*)&aliasHandle, aliasLen);
            Boolean changed;
            err = FSResolveAlias(&fsOriginal, aliasHandle, &fsFile, &changed);
            if (err == noErr) {
                char pathC[2*1024];
                OSStatus status = FSRefMakePath(&fsFile, (UInt8*) &pathC, sizeof(pathC));
                NSAssert(status == 0, @"FSRefMakePath failed");
                NSLog(@"%@", [NSString stringWithCString: pathC encoding: NSUTF8StringEncoding]);
            } else {
                NSLog(@"The file disappeared!");
            }
        } else {
            NSLog(@"CardCollectionUserDefault was zero length");
        }
    }
    

    但是,我仍然对我之前的代码失败的原因感到好奇。我很感激对此的任何想法。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多