数据持久化tableView问题iPhone(读写plist)

Posted

技术标签:

【中文标题】数据持久化tableView问题iPhone(读写plist)【英文标题】:Data persistance tableView issue iPhone(reading and writing to plist) 【发布时间】:2012-11-12 03:58:21 【问题描述】:

在我的应用程序中,我想实现一个简单的警报功能。我知道如何使用 UILocalNotifications,但我遇到了这个源代码,它具有与 iPhone 的本地时钟应用程序警报区域类似的 UI,并且它具有一种类型的数据持久性。这个源代码有两件事我不擅长界面设计和数据持久性。但是我下载了它并开始使用它,发现警报不是持久的。

Download

有谁知道如何调整源代码以使其具有持久性并且可以保存和读取 plist?我也乐于学习,这个领域对我来说也有些陌生。谢谢

【问题讨论】:

【参考方案1】:

我查看了您的代码并发现您没有将“Alarms.plist”文件表单资源移动到文档目录的问题。我们无法编辑资源文件夹中的文件。所以在应用委托文件中编写以下代码。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *theFileName = @"Alarms.plist"; //Change this appropriately

NSString *oldPath = [[NSBundle mainBundle] pathForResource:@"Alarms" ofType:@"plist"];//[NSString stringWithFormat:@"%@/Inbox/%@", documentsDirectory, theFileName];

NSString *newPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, theFileName];

if (![[NSFileManager defaultManager] fileExistsAtPath:newPath])

    [[NSFileManager defaultManager] moveItemAtPath:oldPath toPath:newPath error:nil];

对文档目录文件夹中的文件执行保存操作。

【讨论】:

我将代码添加到 applicationDidFinishLaunching 但仍然没有保存警报。但我注意到,即使应用程序启动时,它也会显示“无法读取 plist 文件:”,并且在我 NSLogged 之后甚至不会调用保存操作?我的 plist 本身有问题吗? @user1814207 在您的代码中,您从不调用 save 方法将数据写入文件,只需在数组中添加对象请调用 AlarmListController 的 save 方法,以便将您的对象添加到文件中。 好的,所以现在调用了 save 但是当我关闭应用程序并重新启动它时它会崩溃 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xf527da0 我认为这一定与数组对其中有新部分感到困惑的事实有关tableView 但我相信我用- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section return [[self displayedObjects] count]; 解决了这个问题 我在我的计算机上找到了 .app 构建文件,以查看新数据是否已保存到 plist 中,但事实并非如此。 这是崩溃日志的图片 - Image【参考方案2】:

试试这个代码...将 plist 从包保存到文档目录 请注意,您将在第一次应用启动时出现“无法读取...”

- (NSMutableArray *)displayedObjects
    
        if (_displayedObjects == nil)
        
            NSString *path = [[self class] pathForDocumentWithName:@"Alarms.plist"];
            NSArray *alarmDicts = [NSMutableArray arrayWithContentsOfFile:path];

            if (alarmDicts == nil)
            
                NSLog(@"Unable to read plist file: %@", path);
                NSLog(@"copy Alarms.plist to: %@", path);
                NSString *pathToSetingbundle = [[NSBundle mainBundle] pathForResource:@"Alarms" ofType:@"plist"];

                [[NSFileManager defaultManager]copyItemAtPath:pathToSetingbundle toPath:path error:nil];            
            

            _displayedObjects = [[NSMutableArray alloc]
                                 initWithCapacity:[alarmDicts count]];

            for (NSDictionary *currDict in alarmDicts)
            
                Alarm *alarm = [[Alarm alloc] initWithDictionary:currDict];
                [_displayedObjects addObject:alarm];
                 NSLog(@"@disply obj %@", alarm);
            
        

        return _displayedObjects;
    

【讨论】:

感谢您的代码,但我认为我的应用程序的问题比我最初预期的要严重。 您的应用程序的问题现在是(我想).. 只是您如何保存数据。测试/修改您的“保存代码” - 检查您的 Alarms.plist(来自文档目录),直到它锁定为止 我想,你必须有.. 一个字典数组.. 这个“newArrayForPlist”必须保存

以上是关于数据持久化tableView问题iPhone(读写plist)的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - UITableViewController 和核心数据行在 tableView 中重复

如何持久化 tableview 行?

从iPhone的核心数据在tableview中一一添加单行

iPhone TableView 数据分为 2 个部分

iPhone TableView 不填充 JSON 数据

iphone SDK:使用核心数据对任意 tableview 行重新排序