2012-09-20 4 views
1

지난 주에 수 백만 번이 넘는 시간을 보냈습니다. (그리고 예, Apple의 문서를 읽었습니다.)보관 된 데이터를 복원 할 수 없습니다.

내 개체를 보관 중이며 파일 시스템에 기록 된 파일을 볼 수 있습니다. 파일 시스템을 검사하면 파일 내에서 내 데이터를 볼 수 있습니다.). 그러나 내 앱을 다시 실행하면 데이터가 복원되지 않습니다. 내가 읽은 모든 예는 이것이 얼마나 쉬운지를 알려주지 만, 나는 그것을 얻지 못하고있다. 하나의 유일한 점은 객체가 싱글 톤이라는 점입니다. 뷰 컨트롤러간에 데이터를 전달하는 데 사용됩니다.

정말 현자 조언에 감사드립니다. 미리 감사드립니다. 앱 위임에서

#import "SharedAppDataObject.h" 

@implementation SharedAppDataObject 

@synthesize skuFieldText; 
@synthesize checkmarkIndex; 
@synthesize apiKeyDictionary; 


    //create our shared singleton store 
+(SharedAppDataObject *)sharedStore { 

    static SharedAppDataObject *sharedStore = nil; 

    if (!sharedStore) { 
     sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; 

     if(!sharedStore) 
      sharedStore = [[super allocWithZone:NULL] init]; 
    } 
    return sharedStore; 
} 

-(id) init { 
    self = [super init]; 
    if (self) { 
    } 
    return self; 
} 

-(void)setValue:(id)apiKey forKey:(NSString *)name { 
     [apiKeyDictionary setObject:apiKey forKey:name]; 
} 

-(void)setSkuField:(NSString *)s { 
    skuFieldText = s; 
} 

-(NSMutableDictionary *)apiKeyDictionary { 
    return apiKeyDictionary; 
} 

-(void)setCheckmarkIndex:(NSIndexPath *)p { 
    checkmarkIndex = p; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:skuFieldText forKey:@"skuFieldText"]; 
    [aCoder encodeObject:checkmarkIndex forKey:@"checkmarkIndex"]; 
    [aCoder encodeObject:apiKeyDictionary forKey:@"apiKeyDictionary"]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super init]; 
    if (self) { 
     [self setSkuFieldText:[aDecoder decodeObjectForKey:@"skuFieldText"]]; 
     [self setCheckmarkIndex:[aDecoder decodeObjectForKey:@"checkmarkIndex"]]; 
     [self setApiKeyDictionary:[aDecoder decodeObjectForKey:@"apiKeyDictionary"]]; 
    } 
    return self; 
} 

+(NSString *)archivePath { 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 
    return [documentDirectory stringByAppendingPathComponent:@"bbyo.archive"]; 
} 

-(BOOL)saveChanges {  
    return [NSKeyedArchiver archiveRootObject:self toFile:[SharedAppDataObject archivePath]]; 
} 

@end 

저장 방법 :

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    BOOL success = [[SharedAppDataObject sharedStore] saveChanges]; 

    if (success) { 
     NSLog(@"Saved all the data"); 
    } else { 
     NSLog(@"Didn't save any of the data"); 
    } 
} 

답변

0

sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]];application:didFinishLaunchingWithOptions:으로 초기화하십시오. 이 메서드는 데이터 구조를 초기화하고 이전 응용 프로그램 상태를 복원하는 데 사용됩니다.

또한 static SharedAppDataObject *sharedStore = nil;sharedStore에서 가져옵니다. 저장 파일이있는 경우 [ShareAppDataObject sharedStore]은 필요하지 않은 파일을 항상 보관 취소합니다. 초기화하는 동안 한 번 아카이브 해제 할 수 있습니다. 당신이 연결 http://bit.ly/PJO8fM

+0

예제는 완벽했다 :

다음은 당신의 문제에 응답 할 수있는 포스트입니다. 감사! – Selch

0

내가 당신에게 대답하지만, 그림에 대한 몇 가지 아이디어를 줄 수 여기

#import <Foundation/Foundation.h> 

@interface SharedAppDataObject : NSObject <NSCoding> 
{ 
    NSMutableDictionary *apiKeyDictionary; 
    NSString *skuFieldText; 
    NSIndexPath *checkmarkIndex; 
} 

+ (SharedAppDataObject *)sharedStore; 

@property (nonatomic, copy) NSString *skuFieldText; 
@property (nonatomic, copy) NSIndexPath *checkmarkIndex; 
@property (nonatomic, copy) NSMutableDictionary *apiKeyDictionary; 

-(void)setValue:(NSString *)apiKey forKey:(NSString *)name; 

-(void)setSkuField:(NSString *)s; 
-(void)setCheckmarkIndex:(NSIndexPath *)p; 

-(NSMutableDictionary *)apiKeyDictionary; 
-(BOOL)saveChanges; 

@end 

내 구현의 : 여기

내 헤더입니다 이거. 이 행을 가져 오는 것 :

sharedStore가 nil이면 뭔가 잘못되었습니다. 따라서 테스트 해보십시오. 아무것도 표시되지 않으면 경로를 기록하고 NSFileManager 메서드를 사용하여 파일의 크기, 크기 등을 확인합니다. 파일이 있고 크기가 있지만 파일을 보관할 수 없다면 물론 문제입니다. 이 경우,이 파일을 만든 직후 특별한 디버그 코드를 추가

-(BOOL)saveChanges {  
    BOO ret = [NSKeyedArchiver archiveRootObject:self toFile:[SharedAppDataObject archivePath]]; 
    id foo = [NSKeyedUnarchiver unarchiveObjectWithFile:[SharedAppDataObject archivePath]]; 
    // check if foo is not nil, if its the proper class, etc. 
} 

파일을 저장할 때 당신은 잘 보관 해제 할 수 있지만, 수는없는 응용 프로그램의 다시 시작할 때, 무언가가 파일에 이상이있는 경우 . 이 모든 정보는 해결책을 제시해야합니다.

또 다른 생각 - 데이터를 인코딩 할 때 로그를 남기고 로그하지 말고 그냥 보관해야합니다.