使用NSMetadataQuery在目录中搜索文件

时间:2013-05-01 20:45:04

标签: iphone ios objective-c icloud uidocument

我的应用正在使用UIDocument + iCloud来创建和查看文档。文件以这种方式存储:

  • 文档/文件名.db
  • Documents / Filename.db / File.db(Filename.db是目录)

Documents / Filename.db目录中的文件在其自己的View Controller中正常加载。在另一个View Controller中打开Documents / Filename.db / File.db时,我在加载这些文件时遇到问题。 文件名不固定,并且多次出现。我可以验证文件是否存储在目录中,因此不应该是问题。

我认为我已经将问题追溯到NSMetadataQuery,因为它只搜索Documents / - 我希望它在目录Documents / Filename.db 中搜索。我已经尝试将查询serachScope设置为正确的路径,但似乎我需要使用NSMetadataQueryUbiquityContainerDocumentsScope进行搜索以返回结果。

- (NSMetadataQuery *)documentQuery 
{
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];

NSString *appending = [NSString stringWithFormat:@"Documents/%@.db/", currentDirectory]; // Directory name
NSURL *documentPath = [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] URLByAppendingPathComponent:appending];
NSLog(@"Document Path: %@", documentPath);

if (query) {

    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

    NSString *filePattern = [NSString stringWithFormat:@"*.%@", STACK_EXTENSION];
    [query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]];

}

return query;

}

- (void)processiCloudFiles:(NSNotification *)notification
{
[_query disableUpdates];
[_iCloudURLs removeAllObjects];

NSArray *queryResults = [_query results];
for (NSMetadataItem *result in queryResults) {

    NSURL *fileURL = [result valueForAttribute:NSMetadataItemURLKey];

    NSLog(@"---- FileURL: %@", fileURL);

    NSNumber *aBool = nil;

    [fileURL getResourceValue:&aBool forKey:NSURLIsHiddenKey error:nil];
    if (aBool && ![aBool boolValue]) {
        NSLog(@"Adding following Stack: %@", fileURL);
        [_iCloudURLs addObject:fileURL];

    }

}

NSLog(@"Found %d iCloud files", _iCloudURLs.count);
NSLog(@"iCloud URLs: %@", _iCloudURLs);

...

}

1 个答案:

答案 0 :(得分:0)

我不确定为什么你的目录有.db扩展名,我可能无法理解你的问题的全部含义,但当我询问在ubiquity容器中使用子目录进行iCloud存储时,我被相信的人告诉我是一个苹果工程师,可以添加子目录,但“没有目录应该有他们的名字或他们可能被视为一个包,这将为你遗憾地结束。此外,你不应该把任何.nosync条目放在顶层容器。“他还说“设置会将文档显示为平面层次结构(例如,它只显示文件和包,而不是目录),其他UI区域也可能在视觉上忽略子目录。”

为了在目录的主表中选择的子目录中有一个文件的详细信息表,我使用了一种方法来迭代查询中的所有项目,并只查找URL中具有子目录的项目。 / p>