2013-08-22 1 views
0

에 나는 NSUSerDefaults에있는 NSDictionary를 저장하려고하지만, 나는 다음과 같은 오류를 얻을 : 비 속성 값 JSON이있는 NSDictionary이다저장 NSDictionary와는 NSUserDefaults

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if(defaults) { 
    [defaults setBool: YES forKey: @"disableGetStarted"]; 
    [defaults setObject: [json mutableCopy] forKey: @"user"]; 
    [defaults synchronize]; 

    NSLog(@"defaults %@", [defaults objectForKey: @"user"]); 
} 

을 삽입 할 시도합니다.

어떻게해야합니까?

+0

사용자 기본값으로 방대한 'NSDictionary'를 저장하지 않는 것이 좋습니다. 사용자 기본값은 막대한 양의 데이터를 저장하는 것이 아닙니다.이 때문에'Documents' 폴더가 있습니다. – holex

+0

그는 사전이 방대한이라고 말하지 않았다 –

+2

@AndreiStanescu, ... 그리고 정확히 내가 사전이 방대하다고 생각하는 이유이다. – holex

답변

2

json은 사전 일 수 있지만 사전의 모든 내용은 사용자 기본값에 저장되는 유효한 값이어야합니다. 모두는 NSData, NSString, NSNumber, NSDate, NSArray 또는 NSDictionary의 인스턴스 여야합니다.

+0

... 변경 가능한 버전 (있는 경우). – holex

+1

서브 클래 싱중인 하위 구성 요소는 이러한 열거 형에 포함됩니다. –

0

사전에있는 하나 이상의 개체가있을 수있는 유일한 개체 인 NSString, NSArray, NSDictionary, NSDate 또는 NSData가 아닙니다. 만있는 NSData,있는 NSString,의 NSNumber,있는 NSDate, NSArray를,있는 NSDictionary 또는 이들의 조합과 같은 사전 내부 표준 객체를 저장하는 경우

- (BOOL)isValidPropertyList:(id)object { 

    // 
    // Check if `object` is a valid property list. 
    // 
    // # Return Value 
    // `YES` if the receiver is a valid property list, `NO` otherwise. 
    // 
    // # Discussion 
    // Intended to be called on NSArray and NSDictionary object to verify if the 
    // receiver is a valid property list. Will emit a description of any 
    // detected error. 
    // 
    NSData  *xmlData; 
    NSString *error; 

    xmlData=[NSPropertyListSerialization 
     dataFromPropertyList:object 
     format:NSPropertyListXMLFormat_v1_0 
     errorDescription:&error 
    ]; 
    if(xmlData) 
    { 
     return YES; 
    } 
    else 
    { 
     NSLog(@"Tested object is not a valid property list: %@",error); 
    } 

    return NO; 
} 
2

: 당신의 사전이 유효하지 않은 이유 코드는 당신에게 더 많은 세부 정보를 제공, 도움이 될 수 있습니다 특별한 일을 할 필요가 없습니다.

그러나 사용자 정의 개체의 인스턴스 (예 : 사용자가 만든 클래스)가 있으면 호환 가능한 유형 (예 : NSData)으로 변환해야합니다. 당신이 아래의 코드를 사용하여 수행 할 수 있습니다

- (id)initWithCoder:(NSCoder*)coder 
- (void)encodeWithCoder:(NSCoder*)coder; 

을 사전을 얻으려면 : 작동하려면이 방법

NSData* data=[NSKeyedArchiver archivedDataWithRootObject:json]; 
[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"] 

을, 당신은 당신이 저장하고자하는 사용자 정의 클래스에서이 두 메소드를 구현 네드 다시 NSUserDefaults (디코딩)에서 다음을 사용할 수 있습니다

NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"user"]; 
NSDictionary* json = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

편집

0 콘솔의 모든 This is bad... 메시지를받을 경우 json 개체가 어떤 [NSNull null] 값이 포함 된 경우

확인하려면 NSUserDefaults

for (id val in [json allValues]) 
{ 
    if ([val isKindOfClass:[NSNull class]]) 
    { 
     NSLog(@"This bad! NSNull should not be in the dictionary"); 
     break; 
    } 
} 

에 당신이 당신의 삽입을하기 전에이 코드 조각을 추가, 당신은 2 개 선택이있다. 1. 위에서 설명한 보관/보관 방법을 사용하십시오. 2. 코드에서 손상되지 않는 경우 NSNull 개체를 사전의 다른 값 (예 : 빈 문자열)으로 바꿉니다.

+0

내 대답은 –

+0

으로 업데이트되었습니다. initWithCoder와 encodeWithCoder는 어디에 두어야합니까? nsdictionary의 항목은 NSStrings입니다. 감사. – user2491297

+0

항목이 NSString이라면 걱정할 필요가 없습니다. 이 두 메서드는 사용자가 만든 사용자 지정 클래스를 저장하는 경우에만 사용됩니다. 제안 된 다른 사람들처럼, json에 [NSNull null] 값이 없는지 확인하십시오. 이렇게하려면 예제 코드로 내 게시물을 편집합니다. –

-1
NSDictionary *dict = [[NSDictionary alloc] init]; 

dict = json; 

[NSUserDefaults standardDefaults] setObject:dict forKey:@"user"]; 

NSUserDefaults는 변경 가능 개체와 변경 불가능 개체를 구분하지 않으므로 다시 가져올 때 변경할 수 없습니다. 그래서 당신은 우연히 변경 가능한 사전에 만들 경우 - 사전 json의>

[[NSUserDefaults standardDefaults] setObject:dict forKey:@"user"] mutableCopy]; 

모든 개체의 인스턴스 여야을 NSData,있는 NSString,의 NSNumber,있는 NSDate, NSArray를, 또는 NSDictionary에 있습니다.