3

学校のプロジェクト用に作成しているiOSアプリケーションで、NSMutableArrayに保存されているデータを保存するのに問題があります。配列はアプリデリゲートファイルに作成され、次にその配列のデリゲートが他のさまざまなViewControllerファイルに作成されます。配列に格納されるデータは、プロパティとしてNSStringsとNSNumbersで構成されるカスタムクラスで構成されます。

私はこのサイトで約1週間、多くの例を読んでフォローしてきましたが、私は一生それを理解することができません。コアデータも調べましたが、完全にやり直さないと実装方法がわからず、残念ながら時間に追われています。

私が試したこと:

WillTerminateメソッドでのアーカイブ。(activityArrayは私の配列です)

- (void)applicationWillTerminate:(UIApplication *)application {
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
[NSKeyedArchiver archiveRootObject:activityArray toFile:arrayFile];
[activityArray release];

次に、AppDelegateファイルのdidFinishLaunchingWithOptionsメソッドでアーカイブを解除します

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
if ([fileManager fileExistsAtPath:arrayFile]) {
    NSLog(@"yes");
    activityArray = [NSMutableArray arrayWithContentsOfFile:arrayFile];
} else {
    activityArray = [[NSMutableArray alloc] init];
}

他の質問の提案に従って、私は自分が持っているカスタムクラスで次のことを行いました(このクラスには2つのNSString、activityNameとactivityDescriptionがあります)。

- initWithCoder:(NSCoder *)aCoder {
self = [super init];
activityName = [[aCoder decodeObjectForKey:@"activityName"] retain];
activityDescription = [[aCoder decodeObjectForKey:@"activityDescription"] retain];
return self;
 }

-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:activityName forKey:@"activityName"];
[aCoder encodeObject:activityDescription forKey:@"activityDescription"];
}

しかし、これはどれも私にはうまくいかないようです。どんな助けでもありがたいです。これはかなり簡単なことだと思いますが、私はそれを理解できないようです。

4

3 に答える 3

1

Core Data は、実際には非常にシンプルで高速に実装できます。数か月前に、すばやくセットアップする方法についてのブログ投稿を作成しました。作成したさまざまなクラスを表すエンティティを作成するか、@dynamic プロパティを自分で追加するだけです。

オブジェクトのみを格納できるという点で、コア データは配列と同じように動作することに注意してください。したがって、int\floats などには NSNumber を使用する必要があります。

于 2011-04-02T21:59:38.877 に答える
0

次のようにNSUserDefaultsを使用して配列を保存できます。

NSData *theData =  [NSKeyedArchiver archivedDataWithRootObject:activityArray];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myArray"];

次に、次のように保存オブジェクトを取得できます。

NSData *theData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myArray"];
NSArray *activityArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];

ただし、これを機能させるには、前述のように、関連するカスタムオブジェクトに対してinitWithCoderメソッドとencodeWithCoderメソッドを実装する必要があります。

于 2011-04-02T15:51:56.567 に答える
0

アーカイブ コードが実行されているかどうかを実際に確認しましたか? マルチタスクが有効になっている iOS 4 では、applicationWillTerminate:実質的に呼び出されることはありません。applicationDidEnterBackground:代わりにコードを入れることを検討する必要があります。

アーカイブ後にアレイを解放することに関しては、ユーザーがアプリを離れたときに失敗し (中断されます)、後で戻ってきます (アプリは再起動されずに再アクティブ化されます)。その場合、配列を解放すると、アプリがクラッシュします。

于 2011-04-02T19:52:29.207 に答える