2012-06-16 26 views
0

OS X的Search Kit Framework允許創建和訪問搜索索引。但是,如果該索引的名稱未知,則無法訪問現有的搜索索引。可用於訪問現有搜索索引(SKIndexOpenWithData,SKIndexOpenWithMutableData,SKIndexOpenWithURL)的框架的所有功能都要求索引名稱。這與存儲搜索索引數據的文件的文件名不同。在不知道名稱的情況下打開現有的搜索工具包框架搜索索引

當我嘗試通過在不知道索引名稱的情況下調用SKIndexOpenWithURL來訪問現有的搜索索引文件時,該函數不會返回有效的SKIndexRef。將NULL作爲索引名稱(如框架文檔中所建議的)不起作用,因爲Search Kit Framework只會嘗試使用索引名稱'IADefaultIndex'。

舉個例子,如果我創建一個這樣的索引名的索引文件:

NSString *path = @"/Users/Tim/Desktop/searchindex.skindex"; 
    NSURL *url = [NSURL fileURLWithPath: path]; 
    NSString *name = @"myIndex";   
    SKIndexType type = kSKIndexInverted;      
    SKIndexRef skIndex; 
    skIndex = SKIndexCreateWithURL ((__bridge CFURLRef)url, (__bridge CFStringRef)name, (SKIndexType)type, (CFDictionaryRef)NULL); 
    // .. 

以後我可以只打開文件和訪問存儲的索引,如果我知道索引名「myIndex」。如果我嘗試打開該文件,而無需(或知道)索引名稱,下面的代碼示例將失敗:

NSURL *skURL = [NSURL fileURLWithPath:@"/Users/Tim/Desktop/searchindex.skindex"]; 
    SKIndexRef skIndex; 
    skIndex = SKIndexOpenWithURL((__bridge CFURLRef)skURL, NULL, true); 
    if (!skIndex) NSLog (@"couldn't open index!"); 

然而,搜索索引的名字無疑是該索引文件中。是否有人知道如何在不知道搜索索引名稱的情況下檢索該名稱或以其他方式訪問搜索索引文件的方式?我知道,根據框架文檔,不可能使用框架來獲取該索引名稱,但它應該是可能的。

回答

2

好了,經過一番研究,我想通了,如何提取從搜索索引文件的索引名:

-(NSString*)getIndexNameOfSKFile:(NSString*)filePath 
{ 
    if (!filePath) return nil; 

    // open the search index file 
    NSData *data = [NSData dataWithContentsOfFile:filePath]; 
    if (!data) return nil; 
    NSUInteger dataLength = [data length]; 

    // calculate the offset where the index name is stored 
    int32_t offset1, offset2; 
    if (dataLength<11) return nil; 
    [data getBytes:&offset1 range:NSMakeRange(4,4)]; 
    [data getBytes:&offset2 range:NSMakeRange(8,4)]; 
    int32_t offset = CFSwapInt32HostToBig(offset1)+(CFSwapInt32HostToBig(offset2)/2)+14; 

    // Get index name string (stored as zero-terminated string) 
    unichar c; 
    NSMutableString *indexName = [NSMutableString stringWithCapacity:0]; 
    do { 
     if (dataLength<(offset+1)) return nil; 
     [data getBytes:&c range:NSMakeRange(offset, 2)]; 
     if (c!=0) [indexName appendString:[NSString stringWithCharacters:&c length:1]]; 
     offset+=2; 
    } while (c!=0); 
    return indexName; 
} 

這可能並不適用於所有OS X版本下工作,但它是爲我工作10.7。

+0

這很激烈。工作很好。你絕對需要索引名稱來訪問索引?您可能會向Apple提交錯誤報告。我從來沒有在文檔中找到任何說你需要索引名稱來訪問索引的東西。 – Philip

+0

謝謝!我已經提交了一個針對文檔的bug - 在SKIndexCreateWithData和SKIndexCreateWithMutableData中,您需要知道索引名稱(如果它不是默認名稱),但是SKIndexOpenWithURL函數缺少這個名稱。我試圖訪問不使用默認索引名稱的第三方索引文件。 – Tim

1

您確定沒有導致問題的索引名稱而不是代碼的其他部分,例如:有效的網址?正如你已經注意到的那樣,文檔說它應該在不知道索引名稱的情況下工作。我已經與Search Kit廣泛合作,從不需要它,這就是爲什麼我懷疑問題可能是其他問題。

你可能會張貼一些代碼?

inIndexName索引的名字:

要獲得關於是否有可能從索引獲得的名稱問題,該方法SKIndexCreateWithURL的文檔沒有說。如果您將 inIndexName設置爲NULL來調用此函數,Search Kit會將該索引指定爲索引名稱IADefaultIndex,默認值爲 。如果您嘗試在同一個文件中創建第二個 索引而未指定名稱,則不會創建第二個索引 ,並且此函數返回NULL。 搜索工具包目前不支持 從索引中檢索索引名稱。

如果您在Cocoa地區工作,我想邀請您使用我的開源搜索套件包裝。你會發現在Github上的代碼:

https://github.com/phildow/SPSearchStore

如果你可以張貼一些代碼,我很樂意看看它。

+0

感謝您的幫助 - 如果有一種方法可以在不知道索引名稱的情況下打開索引文件,我非常感謝您的提示。我澄清了我的問題並添加了一個代碼示例。任何反饋最高度讚賞。我認爲文檔中還存在一個錯誤:雖然SKIndexCreateWithData和SKIndexCreateWithMutableData的文檔狀態傳遞NULL作爲索引名只會導致框架嘗試使用「IADefaultIndex」作爲索引名(如果這不是索引名稱),SKIndexOpenWithURL的文檔中缺少此警告。 – Tim