2013-07-31 136 views
2

在我的應用程序中,我要檢查是否在NSDictionary的數組中有另一個NSDictionary。換句話說,我製作了一個JSON文件,我將其存儲在文檔中。
現在我解析這個JSON來插入一個新條目,然後在我的JSON中插入這個條目之前,我需要檢查它的條目是否已經存儲在我的文件中。我解析JSON這樣:檢查一個NSDictionary數組是否包含一個NSDictionary

// First I read the JSON file from the folder Documents 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"data.json"]; 
NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *dictContent = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
// Json parsing 
NSMutableArray *array = [[NSMutableArray alloc]init]; 
NSMutableArray *arrayOfDictData = [[NSMutableArray alloc]init]; 
if (dictContent) { 
    NSDictionary *sites = [dictContent objectForKey:@"sites"]; 
    NSArray *site = [sites objectForKey:@"site"]; 
    array = [site mutableCopy]; 
} 

然後我有另一個NSDictionarydictForJson),其中我插入從HTML網站解析數據,所以現在我需要檢查,如果在字典中dictForJson的數據仍然在JSON文件。
我該如何檢查?

的dictForJson具有這樣的結構:

dictForJson = @{@"name": htmlTitle, 
        @"src": path, 
        @"expiryDate": expireDate}; 

的NSArray的網站上有這樣的結構:

site: (
     { 
     expiryDate = "29 Ago 2013"; 
     name = Sito4; 
     src = "/Users/redoddity/Library/Application Support/iPhone Simulator/6.1/Applications/2D9EBE71-4365-448D-8AD2-A08749B8DBC1/Documents/Sito4.html"; 
    } 
) 

你有什麼想法? 我試圖與[array containsObject:dictForJson],但NSDictionary的不排序,所以當我用這個方法有時會返回0,其他時間返回1 也許是有用我建立我的JSON用下面的代碼:

- (void)JsonCreateOrEdit { 
    NSDictionary *dictSites = [[NSDictionary alloc]init]; 

    NSDictionary *dictSite = [[NSDictionary alloc]init]; 

    NSMutableArray *site = [[NSMutableArray alloc]init]; 

    NSDictionary *dictForJson = [[NSDictionary alloc]init]; 

    dictForJson = @{@"name": htmlTitle, 
        @"src": path, 
        @"expiryDate": expireDate}; 

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"data.json"]; 
    BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath]; 

    if (!fileExist) { 
     [site addObject:dictForJson]; 
     dictSite = @{@"site": site}; 
     dictSites = @{@"sites": dictSite}; 
     // Creo il file Json 
     NSLog(@"Il file non esiste"); 
     SBJsonWriter *writer = [[SBJsonWriter alloc]init]; 
     NSString *jsonCommand = [writer stringWithObject:dictSites]; 
     [CreateFile createFileIn:documentsPath with:@"data.json" andData:jsonCommand]; // This is a class method I made to create the file 
    else { 
     // Here there are the instructions to update the file data.json 
     NSLog(@"Il file esiste"); 
    // Leggo il file json 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"data.json"]; 
    NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; 
    NSDictionary *dictContent = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
    // Faccio il parsing del json 
    NSMutableArray *array = [[NSMutableArray alloc]init]; 
    NSMutableArray *arrayOfDictData = [[NSMutableArray alloc]init]; 
    if (dictContent) { 
     NSDictionary *sites = [dictContent objectForKey:@"sites"]; 
     NSArray *site = [sites objectForKey:@"site"]; 
     array = [site mutableCopy]; 
     // Here I must check if in the array site there are the same information I'm trying to insert 
    } 
} 
+0

嘗試NSPredicate..this可能會解決您的問題。 –

+0

好的,我可以用NSPredicate做什麼?我從來沒有用過它。 – lucgian84

+0

聽起來像你應該檢查包含相同的鍵和值的字典是否存在。謂詞是一種方法。您還可以先比較鍵和鍵的值。但是你只需要真正確定最簡單的鍵值組合,這些組合將是唯一的。 – uchuugaka

回答

0

我做到了! :) 我做了這麼:

{ 
     // Aggiorno il file 
     NSLog(@"Il file esiste"); 
     // Leggo il file json 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"data.json"]; 
     NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; 
     NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding]; 
     NSDictionary *dictContent = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
     // Faccio il parsing del json 
     NSMutableArray *array = [[NSMutableArray alloc]init]; 
     NSMutableArray *arrayOfDictData = [[NSMutableArray alloc]init]; 
     if (dictContent) { 
      NSDictionary *sites = [dictContent objectForKey:@"sites"]; 
      NSArray *site = [sites objectForKey:@"site"]; 
      NSDictionary *dict = [site objectAtIndex:0]; 
      NSLog(@"dictForJson = %@\ndict = %@", dictForJson, dict); 
      NSString *name = [dict objectForKey:@"name"]; 
      NSLog(@"name: %@", name); 
      array = [site mutableCopy]; 

     } 

和它的作品!謝謝你的時間!

0
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"%K LIKE[c] %@", @"name", @"htmlTitle"]; 
NSArray *theFilteredArray = [mainArrayOfDictionry filteredArrayUsingPredicate:aPredicate]; 

if ([theFilteredArray count]){ 
    NSLog(@"Dictionay Exists"); 
}else{ 
    NSLog(@"Dictionay does not Exists"); 
} 

在第一個聲明中,第一個參數是「Key」,第二個參數是dictionay的實際值。

我假設如下:

NSDictionary *dictForJson = @{@"name": htmlTitle, 
        @"src": path, 
        @"expiryDate": expireDate}; 


NSArray *mainArrayOfDictionry = (

"dictForJson" : @{@"name": htmlTitle, 
        @"src": path, 
        @"expiryDate": expireDate}; 
), 
(), 
(), 
(), 
. 
. 
. 
) 

* 希望這會幫助你。 * Array

+0

我應該在什麼地方放置這個'@「%K LIKE [c]%@」'? – lucgian84

+0

@Xman:你測試了你的代碼嗎?我可能是錯的,但我認爲比較字典和'LIKE'實際上並不一樣。 –

+0

原樣使用...它是謂詞格式說明符.. https://developer.apple。com/library/mac /#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#// apple_ref/doc/uid/TP40001795 –

相關問題