0

我无法让添加到收藏夹功能正常工作。这是我用来为收藏夹数据设置数组和字典的代码:

在应用程序委托中,在“appDidFinishLaunching”中:

delegateFavouritesDictionary = [NSMutableDictionary dictionary];

NSLog(@"Mutable Dictionary: %@", delegateFavouritesDictionary);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

[delegateFavouritesDictionary writeToFile:filePath atomically: YES];

delegateFavouritesArray = [[NSMutableArray alloc] init];

然后在我的 detailViewController 中,我有一个 addToFavourites 函数:

if([[addToFavouritesDictionary allKeys] containsObject:ID]) {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

    [addToFavouritesDictionary removeObjectForKey:ID];
    [addToFavouritesArray removeObject:Name];
    [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal];
    [addToFavouritesDictionary writeToFile:filePath atomically: YES];
    NSLog(@"New Dictionary: %@", addToFavouritesDictionary);

} else {

    [addToFavouritesArray addObject:Name];
    NSString *ID = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID"];
    [addToFavouritesDictionary setObject:Name forKey:ID];
    [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

    [addToFavouritesDictionary writeToFile:filePath atomically: YES];
    NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary);
    //[addToFavouritesDictionary release];
}

上面的代码按预期工作,在应用程序启动时,它设置一个字典并将“Saved.data”的内容加载到字典中,然后在 detailViewController 中,它加载“Saved.data”文件并添加或删除该文件. 我遇到的问题是当 iPhone 重新启动时,所有收藏夹数据都消失了,或者如果应用程序崩溃然后再次打开,收藏夹中的所有数据都消失了。有什么方法可以在每次设备重启或关机时保存数据而不被删除?

提前谢谢了。

4

2 回答 2

0

似乎您每次启动应用程序时都会覆盖您的收藏夹,在 appDidFinishLaunching 中您正在创建一个新字典并保存到 saved.data,现在如果您在 detailViewController 中阅读它,您将获得新的空字典。

这可以解释为什么如果 iPhone 重新启动,您会使用您的数据,因为关闭和打开设备并不会删除您保存在 Documents 目录中的文件。该目录在那里,以便您可以保存数据并在重新启动之间安全地保存它,否则它没有任何意义,然后它应该被称为“tmp”,但不是。

编辑

建议:只在 appDidFinishLoading 中加载一次,每次更改时保存或在离开应用程序时保存(applicationDidEnterBackground 和/或 applicationWillTerminate - 如果您支持多任务处理,则前者,否则,您应该没问题。

编辑

我所做的是使用 NSKeyedArchiver 和 NSKeyedUnarchiver,所以保存数据:

[NSKeyedArchiver archiveRootObject: d toFile: filePath];

然后恢复:

NSMutableDictionary *d = [NSKeyedUnarchiver unarchiveObjectWithFile: filePath];
if (d == nil) {
    d = [[NSMutableDictionary alloc] init];
}

你也可以试试这个:+ (id)dictionaryWithContentsOfFile:(NSString *)path从文件中获取字典的 NSDictionary 类:

delegateFavouritesDictionary = [NSMutableDictionary dictionaryWithContentsOfFile: filePath];
if (delegateFavouritesDictionary == nil) {
    delegateFavouritesDictionary = [[NSMutableDictionary alloc] init];
}

如您所见,您不必检查文件是否存在,因为如果出现任何错误,您将得到 nil,在这种情况下,您将创建一个空实例。

于 2011-05-14T12:06:09.657 回答
0

为什么不将其存储在用户首选项中?

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:yourobject forKey:@"yourkey"];

或者在 SQLite 中...

于 2011-05-14T11:05:15.373 回答