認爲這是一個初學者的有關數據管理的問題。與NSUserDefaults的
我有一個應用程序,它加載和保存不同的txt文件。我想給每個txt文件保存在txt文件中的某些特性,例如名稱,樣式,顏色等。
我到目前爲止所做的事情是創建一個NSMutableArray * myLibrary,我將其中所有這些引用。該陣列是這樣的:
- 每個txt文件一個對象被添加到在MyLibrary
- 每個對象擁有幾個NSString的,NSUInteger,布爾值將和一些NSMutableArrays
- 在我的子類
這些對象,我與
工作 - (ID)的initWithCoder:(NSCoder *)aDecoder; - (void)encodeWithCoder:(NSCoder *)aCoder;
現在,我的大問題是什麼是最好的和最安全的方式是要持之以恆此數據。到目前爲止,我已經與的NSKeyedArchiver工作,但用戶報告數據丟失和出現了,其中iTunes同步據稱造成數據被搞砸了一個奇怪的情況。 NSUserDefaults是否有任何保護程序?每當用戶做出更改時,我都會保存myLibrary.dat,因此我不明白爲什麼它不應該是100%保存。任何意見/建議/解釋將非常感謝!
這裏是我寫和讀碼myLibrary.Dat:
-(NSString*)documentsDirectory
{
NSLog(@"documentsDirectory");
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
return documentsDirectory;
}
-(void)saveLibraryDat {
NSLog(@"Saving myLibrary.dat...");
NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"myLibrary.dat"];
BOOL succeed = [[NSKeyedArchiver archivedDataWithRootObject:myLibrary] writeToFile:filePath atomically:YES];
if (!succeed){ // do something }
}
-(void)loadLibraryDat {
NSLog(@"loadLibraryDat");
NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"myLibrary.dat"];
self.myLibrary = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
if (self.myLibrary == nil) {
NSLog(@"myLibrary.dat empty... set up new one");
[self setupLibrary];
} else { NSLog(@"Loading myLibrary.dat successful."); }
}
編輯:我的編碼方法是這樣的:
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.titleName = [aDecoder decodeObjectForKey:@"titleName"];
self.fileName = [aDecoder decodeObjectForKey:@"fileName"];
self.fileFont = [aDecoder decodeObjectForKey:@"fileFont"];
self.tabTitles = [aDecoder decodeObjectForKey:@"tabTitles"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:titleName forKey:@"titleName"];
[aCoder encodeObject:fileName forKey:@"fileName"];
[aCoder encodeObject:fileFont forKey:@"fileFont"];
[aCoder encodeObject:tabTitles forKey:@"tabTitles"];
}
@end
在標題中這些被定義如:
NSString *titleName;
NSString *fileName;
NSString *fileFont;
NSMutableArray *tabTitles;
那四個成員變量是什麼類型的?的NSString *? –
@Matthieu Cormier:對不起,他們是NSStrings和NSMutableArrays。我也有BOOL,NSUInteger,但不希望把它們包含在這裏,以使它不那麼複雜。 –