簡體   English   中英

在核心數據中保留書簽

[英]Persisting bookmark in core-data

我有一個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

感謝您的幫助,謝謝!

我在代碼中找不到任何問題,因此我進行了更改。

在找到“ no scheme”消息的原因之后,我得出結論,該代碼需要一些第三方應用程序才能工作,這是不可取的。

我現在正在使用別名。 這是我創建它們的方式:

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");
    }
}

但是,我仍然對為什么以前的代碼失敗感到好奇。 我對此表示感謝。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM