私のアプリは、ユーザーが評価してメモをとることができるアイテムのリストです。これらのアイテム(ユーザーの評価とメモを保存する辞書)はすべて、アプリが最初に読み込まれたときにドキュメントディレクトリに移動されるplistに保存されます( plistファイルがドキュメントディレクトリにすでに存在する場合は、この手順をスキップします)。今、私はいくつかのレビューをしました、そして人々はリストにもっと多くのアイテムがあるべきであると言っています。今、私は新しいアイテムをplistに追加する方法を見つけようとしています。それらを既存のplistに追加すると、アプリがデータベースがドキュメントディレクトリにすでに存在するかどうかを確認するため、ユーザーには新しいアイテムが表示されません。したがって、彼らは新しいリストを受け取ることはありません。そこで、アイテムを含む新しいplistを作成し、アイテムが含まれていない場合は、新しい各アイテムを古いplistに追加することを計画しました。tはすでに存在します(ユーザーが自分でアイテムを追加できるため、ユーザーが同じ名前のアイテムを追加した場合に備えて、重複したエントリを作成したくないため)。私のジレンマは、plistのマージを正確にどこで/どのように行うかがわからないことです。App Delegateでそれを行いますか?私はでそれをしますかviewDidLoad
メインビューの?アプリが古いplistに新しいアイテムをすでに追加している場合、アプリが読み込まれるたびにチェックを停止するにはどうすればよいですか?私はそれを行うためのさまざまな方法があることを知っています。私はそれを行うための最も簡単で「アプリの負荷が少ない」方法を探しています。
質問する
511 次
1 に答える
0
Ok。iOSチャットの1つで数人の人のおかげで解決しました。したがって、基本的application didFinishLaunchingWithOptions
に私のメソッド内で、AppDelegate.m
両方の plist を 2 つの異なるNSArrays
array1 と array2 にロードしました。また、NSMutableArray array3 を作成し、ユーザー ドキュメント ディレクトリにあった元の plist をロードしました。それらに基づいて重複するアイテムを追加しませんでしたName_Key
(配列内のアイテムは辞書であるため)。項目が一致しない場合は、3 番目の配列 (array3) に追加します。次に、array3 を元の plist ファイル パスに保存しました。次に、ユーザーのデフォルト内に整数を設定して、このタスクを1回だけ実行します。ユーザーがアプリを開くたびに、アプリがこれを通過することを望みませんでした。以下は私が使用したコードです。
int haveMergedPlist = [[NSUserDefaults standardUserDefaults] integerForKey:@"merged plist"];
if (haveMergedPlist < 1){
// I used a integer rather than a BOOL because if I ever want to perform this operation again with another app update all I have to do is change the number.
// merge code here
//new plist
NSString *newPlistPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"NewPlist.plist"];
NSArray *newPlistArray = [[NSArray alloc]initWithContentsOfFile:newPlistPath];
//original plist in user documents directory
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [searchPaths lastObject];
NSString *originalPlistPath = [documentsDirectory stringByAppendingPathComponent:@"originalPlist.plist"];
NSArray *originalPlistArray = [[NSMutableArray alloc]initWithContentsOfFile:originalPlistPath];
NSMutableArray *combinedPlistArray = [[NSMutableArray alloc]initWithContentsOfFile:originalPlistPath];
// Loop through both plists arrays and add if it does not match/exist.
BOOL itemExists = YES;
for (NSDictionary *newItem in newPlistArray) {
for (NSDictionary *originalItem in originalPlistArray) {
NSString * newItemNameString = [[newItem objectForKey:NAME_KEY] lowercaseString];
NSString * origItemNameString = [[originalItem objectForKey:NAME_KEY] lowercaseString];
//Compare lowercase strings and if they don't match then add them to the original plist array.
if ([newItemNameString isEqualToString:origItemNameString]) {
itemExists = YES;
break;
} else {
itemExists = NO;
//doesn't match so add it
}
}
if (itemExists == NO) {
[combinedPlistArray addObject:newItem];
NSLog(@"newItem added");
itemExists = YES;
}
}
//Write Array With New Items Added to documents directory
NSString *writeableDBPath = [documentsDirectory stringByAppendingPathComponent:@"originalPlist.plist"];
[combinedPlistArray writeToFile:writeableDBPath atomically:YES];
//set integer to 1 in user defaults so it only merge's once
//I comment this out while getting the loops to work otherwise you will have to delete the app out of the simulator or the phone to make sure its working every time.
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"merged plist"];
}
于 2013-01-14T21:18:40.430 に答える