我正在开发一个我有一些数据的应用程序。这将是我想要使用的一些字符串。 问题是我想用文件的数据初始化。类似的东西:
@property (strong, nonatomic) Cow *cow;
_cow = [[Cow alloc] init (NSString *) @"Some string"];
我有适当的接受字符串的牛的构造函数。 我想要的是我可以用不同的字符串初始化几个奶牛的方式,并且如果我想要的话重复一些值。
我在一个文本文件中思考我拥有所有字符串,然后选择我想要的那些。 另一种可能性是像SQlite这样的数据库。
答案 0 :(得分: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
个对象?性能要求是什么?等等。
答案 1 :(得分:1)
您可以使您的对象Cow符合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"];
}
之后,您可以将其保存到文件中(您可以创建Cow对象数组并将其保存到文件中):
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;
}
让我知道它对你有用。