gpt4 book ai didi

ios - 如何保存主要详细应用程序的数据,以便在应用程序后加载?

转载 作者:行者123 更新时间:2023-11-29 10:59:39 26 4
gpt4 key购买 nike

我对此主题进行了长期的艰苦研究,但找不到解决方案。我对使用xcode进行iPhone应用程序开发非常陌生,因此请使答案易于理解。我遵循了Apple的“您的第二个iOS应用”教程,并使主详细信息应用正常运行,但现在我想保存用户输入的数据,以便在重置应用后将其显示。该代码与Apple教程here上的代码相同

提前致谢!

最佳答案

您需要做出两个主要决定:如何存储数据,以及何时存储/检索数据。让我们从如何存储数据开始。

如何存储数据

您可以采用三种主要方法:保存到文件,保存到SQLite数据库(使用或不使用包装器(例如FMDB)),使用CoreData。最终,您将需要掌握SQLite和CoreData,但是现在,我建议采用第一种方法。

如果要保存到文件或从文件中读取文件,则需要确定格式。有许多不同的选项,包括XML,JSON,您自己的自定义格式等。实际上,对于“真实”项目,根据项目目标,诸如JSON之类的格式可能是一个不错的选择。但是,由于许多机制已经就绪,因此我将讨论使用序列化存档。

要将数据存储在存档中,您将使用 NSKeyedArchver 将数据写入文件。稍后,您将使用 NSKeyedUnarchiver 从文件中检索信息。这些类对字节流进行编码/解码,然后通过有线发送,写入文件等。

您的主要数据结构是NSMutableArray,名为 masterBirdSightingList ,因此存档器需要对数组进行编码。 NSArray及其可变对象已经知道如何进行编码/解码:它们只是对每个元素以及一些簿记信息进行编码/解码。因此,这个难题还有一个缺失的部分。您需要指定如何编码/解码BirdSighting类的实例。

要指定此名称,请修改该类,以使其实现 NSCoding 协议。在BirdSighting.h中,将@interface声明更改为

@interface BirdSighting : NSObject <NSCoding>

实施NSCoding很简单。我在上面提到过,各种数组类都知道如何进行编码/解码,即它们已经实现了NSCoding协议。为了对BirdSighting进行编码/解码,我们只需要对类的每个数据成员进行编码/解码。查看源代码,我看到它们是两个NSString和一个NSDate。但是,每个这些类也已经实现了NSCoding。因此,为了对BirdSighting实例进行编码/解码,我们只需要告诉我们每个实例变量即可对其进行编码/解码。我们通过添加到BirdSighting类中的 initWithCoder: encodeWithCoder:方法来完成所有这些工作。

注意:我要介绍的细节之一是存档器和键控存档器之间的区别。通常,您将需要使用键控存档器,因此需要使用三个宏定义。老实说,我将创建NAME_KEY等作为静态NSString常量而不是宏。
#define NAME_KEY @"name"
#define LOCATION_KEY @"location"
#define DATE_KEY @"date"

- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_name = [aDecoder decodeObjectForKey:NAME_KEY];
_location = [aDecoder decodeObjectForKey:LOCATION_KEY];
_date = [aDecoder decodeObjectForKey:DATE_KEY];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:NAME_KEY];
[aCoder encodeObject:self.location forKey:LOCATION_KEY];
[aCoder encodeObject:self.date forKey:DATE_KEY];
}

还有一点需要注意,因为BirdSighting直接继承自NSObject(未实现NSCoding),所以我使用 self = [super init]。如果父类确实实现了NSCoding,则需要执行 self = [super initWithCoder:aCoder]

通过上述操作,可以轻松保存到文件或从文件中读取文件。在BirdSightingDataController中的某个位置,可能在 initializeDefaultDataList 中,我们插入以下内容:
masterBirdSightingList = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

其中path是一个NSString,其中包含归档文件的目录路径以及有关需要在生产代码中进行错误检查和处理的常见警告(例如,如果文件不存在该怎么办)。

保存数据也很容易。我们可以将以下方法添加到BirdSightingDataController对象:
- (BOOL)archiveToPath:(NSString *)path
{
BOOL success = [NSKeyedArchiver archiveRootObject:self.masterBirdSightingList];
return success;
}

何时存储数据

现在我们已经有了保存和恢复数据的代码,我们需要确定何时执行这些操作。在这里,我将变得更加模糊,因为其他问题(例如整个应用程序的结构)也会起作用。但是,由于与后台运行有关的方法,例如 applicationWillResignActive: applicationWillEnterForeground:,因此,应用程序委托可能是管理列表的归档和取消归档的候选对象。

在进入后台之前删除目击清单的内存副本是一件好事。这建议将用于创建存档的代码放在应用程序委托中。相反,您应该考虑延迟加载列表,即在准备好显示列表之前不要检索它,这建议将用于检索列表的代码放在BirdSightingDataController的init方法中。

现在,您面临的挑战是如何做到这一切而又不会过度耦合和使应用程序过于复杂。但是,我将把讨论留给另一个问答环节。

关于ios - 如何保存主要详细应用程序的数据,以便在应用程序后加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com