2013-11-23 6 views
0

일부 데이터가있는 앱을 개발 중입니다. 내가 사용하기 원하는 문자열이 될 것입니다. 문제는 파일의 데이터로 초기화하고 싶습니다. something like :iOS 앱에서 데이터를 관리하는 방법

@property (strong, nonatomic) Cow *cow; 
_cow = [[Cow alloc] init (NSString *) @"Some string"]; 

나는 문자열을 받아들이는 젖소의 적절한 생성자를 가지고있다. 내가 원하는 것은 다른 문자열을 가진 severals 암소를 초기화하고 원하는 경우 일부 값을 반복 할 수있는 방법입니다.

나는 모든 문자열을 가지고있는 텍스트 파일에서 생각하고 있었고, 내가 원하는 것을 선택했다. 또 다른 가능성은 SQlite와 같은 DB입니다.

+0

obj-c 언어에 대해 더 자세히 읽어야한다고 생각합니다. 어쨌든 시도해보십시오 : Cow * cow = [[Cow alloc] initWithString : @ "cowName"]; Cow * cow2 = [[Cow alloc] initWithString : @ "secondCowName"]; –

+0

나는 그것을 의미하지는 않았다. 죄송합니다. 내가 원했던 것은 내가 원하는 데이터를 선택하는 db와 같은 것입니다. – hcarreras

답변

1

당신은 개체 암소가 NSCoding 프로토콜을 준수 할 수 있습니다 :

//Cow.h file 
@interface Cow : NSObject <NSCoding> 
@property(nonatomic, copy) NSString *someString; 
@end 

//Cow.m 
- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) { 
     _someString = [aDecoder decodeObjectForKey:@"someString"]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.someString forKey:@"someString"]; 
} 

그리고 그 후 당신은 (당신이 암소 개체의 배열을 생성하고 파일에 저장할 수 있습니다) 파일로 저장할 수 있습니다 :

NSrray *data = @[cow1, cow2, cow3]; 
[NSKeyedArchiver archiveRootObject:data toFile:[self pathToFile]]; 

그리고 당신은 그런 식으로 읽을 수는 :

NSFileManager* fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:[self pathToData]]) 
    { 
     NSData *data = [NSData dataWithContentsOfFile:[self pathToData]]; 
     NSMutableArray *dataArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
     // dataArray -> array with your data 
    } 

는 다행스럽게도 필자는 당신의 질문을 이해했다.

// EDITED

가져 오기 경로에 파일을

-(NSString*)pathToData 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MyData"]; 

    NSFileManager* fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:filePath]) 
    { 
     [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil]; 
    } 

    return [filePath stringByAppendingPathComponent:@"mydata.plist"]; 
} 

저장 및 제거 데이터 :

-(BOOL)save 
{ 
    NSMutableArray *data = [self cachedDataFromFile]; 
    if (!data) 
    { 
     NSLog(@"data = nil"); 
     data = [NSMutableArray arrayWithArray:@[self]]; 
    } 
    else 
     [data addObject:self]; 

    return [NSKeyedArchiver archiveRootObject:data toFile:[self pathToData]]; 
} 

-(void)removeFromFile 
{ 
    NSMutableArray *data = [self cachedDataFromFile]; 
    if (!data) 
     return; 
    else 
    { 
     [data removeObject:self]; 
     [NSKeyedArchiver archiveRootObject:data toFile:[self pathToData]]; 
    } 
} 

-(NSMutableArray*)cachedDataFromFile 
{ 
    NSFileManager* fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:[self pathToData]]) 
    { 
     NSData *data = [NSData dataWithContentsOfFile:[self pathToData]]; 
     NSMutableArray *dataArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

     return dataArray; 
    } 

    return nil; 
} 

가 알려줘은 당신을 위해 일이다.

+0

고맙습니다. 이것은 내가 원하는 원한다. 하지만 여전히 질문이 있습니다. 응용 프로그램을 실행할 때 모든 데이터를 만들어야합니까? 실제로 데이터를 읽는 것이 정말 도움이 되겠지만 어떻게 한 번만 만들 수 있습니까? – hcarreras

+1

당신의 요구 사항이 무엇인지 모르겠습니다. 필요한 경우 새 데이터 (Cow 개체)를 만들 수 있습니다. 그러면 파일에서 기존 데이터를 읽을 수 있으며 새 개체를 데이터에 추가하고 다시 저장할 수 있습니까? 그게 너가하고 싶은거야? 이름으로 개체를 얻으려면 파일에서 배열을 읽고 배열을 필터링 할 수 있습니다 (NSPredictate) – Greg

+0

정확히 원하는 것입니다. 그러나이 데이터 파일을 만드는 방법에 대해 검색 중이 었으며 아무 것도 발견하지 못했습니다. 이 데이터 파일을 만들고 관리하는 방법을 알고 있습니까? – hcarreras

2

다른 답변에 대한 귀하의 의견을 읽고, 귀하의 응용 프로그램에 대한 개체 그래프 지속성 메커니즘에 관심이있는 것으로 보입니다. @ 그렉 - 개체 그래프 직렬화에 의해 주어진 대답은 우수합니다. 기본 경우에는 전체 개체 그래프를 메모리로 읽어 들일 수 있습니다. 원하는 그래프 일 수도 있고 아닐 수도 있습니다. (그것도 다루는 방법이 있습니다.) 원하는 데이터를 선택하는 방법에 대해 질문했습니다. Cow이 메모리에있는 경우 많은 방법으로 선택하여 Cow을 찾을 수 있습니다. 예 :

#import <Foundation/Foundation.h> 

@interface Cow : NSObject 
@property (nonatomic,copy) NSString *color; 
@end 

@implementation Cow 
@end 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     Cow *brownCow = [Cow new]; 
     brownCow.color = @"brown"; 

     Cow *whiteCow = [Cow new]; 
     whiteCow.color = @"white"; 

     NSArray *cows = @[brownCow,whiteCow]; 

     NSUInteger cowIndex = [cows indexOfObjectPassingTest:^BOOL(Cow *obj, NSUInteger idx, BOOL *stop) { 
       return [[obj color] isEqualToString:@"brown"]; 
     }]; 
     if(cowIndex != NSNotFound) 
      NSLog(@"Your brown cow is: %@",cows[cowIndex]); 
     else 
      NSLog(@"No brown cow"); 
    } 
} 

그러나 다른 개체 지속성 프레임 워크를 고려할 수 있습니다. 예를 들어, Core Data이 일반적으로 사용됩니다. sqlite3은 FMDB과 같은 객체 지향 추상화 레이어와 함께 사용할 때 또 다른 좋은 선택입니다.

답은 귀하의 요구 사항에 따릅니다. 얼마나 많은 수의 Cow 개체가 있을까요? 성능 요구 사항은 무엇입니까? 등등.

관련 문제