iphone数据持久性健全性检查

时间:2009-08-21 03:07:37

标签: iphone

好吧,我正在尝试确定我选择保留基于网络的数据的方式是否适合我的iPhone应用程序。

我还没有深入研究Core Data的复杂性,所以我仍然使用Sqlite和FMDB包装器。

以下是我现在的表现:

我有一个使用类似于thelements示例的单例的类。创建静态共享实例,并在两个或多个视图之间共享。数据被下载并加载到此类的数组中。我将下载存储在Sqlite中。我在初始化时加载Sqlite存储的数据,并从每个时间戳的Web获取任何更新。

我这样做是“正确的”方式吗?这看起来合适吗?

为简洁起见,这是一些严重削减的伪代码。

@implementation theClass
static theClass *sharedInstance = nil;
...
- (void)requestDone:(Request *)request
{
    NSDictionary *results=[[request responseString] JSONValue];
    [self._array removeAllObjects];
    [self._array addObjectsFromArray:results];
    [self updateDatabase]; //stores any new results
    [[NSUserDefaults standardUserDefaults] setObject:self.lastUpdated forKey:@"LastAccessed"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self didFinish];
}
-(void)setupArray {
    self._array=[NSMutableArray array];
    ...
}
...
-(void)getUpdates {
    NSURL *jsonURL = [NSURL URLWithString:@"URL TO THE WEBDATA"];
    request = NSURLRequst....
}
- init {
    if (self = [super init]) {
        [self setupArray];
    }
    return self;
}

+ (theClass *)shared {
    @synchronized(self) {
        if (sharedInstance == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [super allocWithZone:zone];
            return sharedInstance;  // assignment and return on first allocation
        }
    }
    return nil; //on subsequent allocation attempts return nil
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)retain {
    return self;
}

- (unsigned)retainCount {
    return UINT_MAX;}

- (void)release {
    //do nothing
}

- (id)autorelease {
    return self;
}

2 个答案:

答案 0 :(得分:0)

我正在研究同样的问题,我得出结论,NSUserDefaults适用于小型数据集,即类似设置和可能的状态,但不是状态数据。我正在查看使用[NSArray writeToFile]保存的大数据值或数据,并使用[NSArray initFromFile]进行回读。

您必须查询分配给您的应用程序的路径并附加您的文件名。我还没有学到的是如何检查文件是否存在,如何删除(或其他一些清除/重置方式)。

我将在今晚进行实验。我想要做的另一件事是保留一个XML文件,但我认为我所希望的只是一个文件中的XML字符串。这样,我可以共享相同的逻辑来检索网络上的数据并加载类似数据的本地副本。

BTW - 单身人士的目的是什么?您已拥有所有线程,并且没有其他进程(应用程序)可以访问您的沙箱,因此您应该能够使用信号量(互斥)。我的问题不是挑战,而是帮助我了解哪些模式在iPhone中有用。

答案 1 :(得分:0)

我实际上只是使用NSUserDefaults plist来捕捉最后更新的时间(如果我需要它)。我将所有内容存储在sqlite DB([self updateDatabase])中。

检查文件是否存在:

NSString *fullPath = [[[NSBundle mainBundle]bundlePath] stringByAppendingPathComponent:@"filenamehere"];
//--or--
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filenamehere];

if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) ...

要删除:

[fileManager removeItemAtPath:pathtofile error:NULL];

我猜你的问题是我(有点)的问题。我想知道当应用程序中的多个视图控制器访问数据时,单例类是否应该处理对持久数据存储的访问。我只是坚持设计,因为它适用于我的应用程序(虽然在非常大的应用程序中我可以看到内存问题,我猜)。所以我想我已经回答了我自己的问题。