如何管理iOS应用中的数据

时间:2013-11-23 10:51:42

标签: objective-c constructor

我正在开发一个我有一些数据的应用程序。这将是我想要使用的一些字符串。 问题是我想用文件的数据初始化。类似的东西:

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

我有适当的接受字符串的牛的构造函数。 我想要的是我可以用不同的字符串初始化几个奶牛的方式,并且如果我想要的话重复一些值。

我在一个文本文件中思考我拥有所有字符串,然后选择我想要的那些。 另一种可能性是像SQlite这样的数据库。

2 个答案:

答案 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;
}

让我知道它对你有用。