2013-11-23 48 views
0

我正在開發一個應用程序,我有一些數據。這將是我想要使用的一些字符串。 問題是我想用文件的數據進行初始化。像這樣:如何在iOS應用程序中管理數據

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

我有正確的構造函數牛接受一個字符串。 我想要的是我可以用不同的字符串初始化幾頭母牛,並重復一些值,如果我想。

我想在一個文本文件中,我有所有的字符串,只是選擇我想要的。 另一種可能性是像SQlite這樣的db。

+0

我想你應該閱讀更多關於obj-c語言。無論如何嘗試:牛*牛= [[牛分配] initWithString:@「cowName」]; Cow * cow2 = [[Cow alloc] initWithString:@「secondCowName」]; –

+0

我不是那個意思。抱歉。我想要的就像是一個數據庫,我選擇我想要的數據。 – 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

將您的意見閱讀到其他答案,似乎您對您的應用程序的對象圖持久性機制感興趣。 @Greg給出的答案 - 對象圖序列化 - 非常好。在默認情況下,你會將整個對象圖形讀入內存中,這可能會或可能不是你想要的。 (也有處理這個問題的方法。)你問過如何選擇你想要的數據。如果您的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對象?性能要求是什麼?等等。

相關問題