添加到收藏夹功能

时间:2011-05-14 10:58:39

标签: iphone favorites

我在添加收藏夹功能时遇到了一些麻烦。 这是我用来为收藏夹数据设置数组和字典的代码:

在app delegate中,在“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];
}

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

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

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

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

或者在SQLite中......

答案 1 :(得分: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];
}

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

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

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