Я настоятельно рекомендую использовать какую-либо базу данных для сохранения таких данных, либо Core Data, либо SQLite.С помощью SQLite (моя сильная сторона) вы можете оставить файл базы данных открытым, сохранив изменения в массиве транзакционно.Существует очень мало шансов, что что-то пойдет не так, благодаря механизму журналирования SQLite и его потрясающе тщательному режиму тестирования .Базовые данные основаны на SQLite, поэтому применяются те же гарантии.
РЕДАКТИРОВАТЬ (RE: comments):
Избыточность является проблемой только в тех случаях, когда стоимость решения чрезмерна для этой проблемы.решаетсяSQLite просто сидит без дела, прося, чтобы его использовали.Во-первых, вы можете создать структуру данных для более осмысленного представления данных:
@interface Memo {
NSString *title;
NSString *textBody;
};
@property (nonatomic, retain) title;
@property (nonatomic, retain) textBody;
@end
@implementation Memo
@synthesize title, textBody;
@end
Необработанный интерфейс SQLite немного неуклюж, так что я бы сохранил и загрузил их, используя C ++ библиотеку-оболочку для простоты:
- (NSString *)databasePath {
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
// Choose a filename for your database.
return [documentsDir stringByAppendingPathComponent:@"data.db"];
}
- (void)saveMemos:(NSArray *)memos {
try {
sqlite3_connection con([[self databasePath] cStringUsingEncoding:NSUTF8StringEncoding]);
con.executenonquery("CREATE TABLE IF NOT EXISTS memo (i, title, textBody)");
sqlite3_transaction trans(con);
{
sqlite3_command cmd(con,
"INSERT INTO memo (i, title, textBody) VALUES (?, ?, ?)");
for (int i = 0; i < memos.count; i++) {
Memo *memo = (Memo *)[memos objectAtIndex:i];
cmd.bind(1, i);
cmd.bind(2, [memo.title cStringUsingEncoding:NSUTF8StringEncoding]);
cmd.bind(3, [memo.textBody cStringUsingEncoding:NSUTF8StringEncoding]);
cmd.executenonquery();
}
}
trans.commit();
} catch(exception &ex) {
NSLog(@"SQLite3 error: %s", ex.what());
}
}
- (NSMutableArray *)loadMemos {
sqlite3_connection con([[self databasePath] cStringUsingEncoding:NSUTF8StringEncoding]);
NSMutableArray *result = [NSMutableArray arrayWithCapacity:10];
if (con.executeint("SELECT COUNT(*) FROM sqlite_master WHERE name = 'memo'")) {
sqlite3_command cmd("SELECT title, textBody FROM memo ORDER BY i");
sqlite3_reader rd = cmd.executereader();
while (rd.read()) {
Memo *memo = [[Memo alloc] init];
memo.text = [NSString stringWithFormat:@"%s", rd.getstring(0).c_str()];
memo.titleBody = [NSString stringWithFormat:@"%s", rd.getstring(1).c_str()];
[result addObject:memo];
}
}
return result;
}
(ВНИМАНИЕ: Этот код полностью не проверен.)
Маловероятно, что формат файла, созданный на дому, потребует меньше кода, чем этот, ипочти наверняка он будет менее надежным.
Вам также следует учитывать Базовые данные, но я сам ими не пользовался, поэтому не могу предложить помощь на этом фронте.