2013-03-25 2 views
2

Привет, я попытался добавить значения (идентификатор книги, номер страницы, заметки) из NSdictionary в Plist, но каждый раз, когда новое значение заменяет предыдущее, но мне нужны все значения в plist my code для добавления словаря в PLIST являетсяЗначение NSDictionary вместо замены в Plist

NSString *[email protected]"95"; 
NSString *[email protected]"12"; 
userNotes=[[NSMutableDictionary alloc]init]; 
[userNotes setValue:userNotesTextview.text forKey:@"notes"]; 
[userNotes setValue:bid forKey:@"bookid"]; 
[userNotes setValue:pnum forKey:@"pagenumber"]; 
userNotesView.hidden=YES; 
_background.hidden = YES; 
[email protected]""; 
[self savingMetaData]; 
    NSMutableArray *notes=[[NSMutableArray alloc]init]; 
    [notes addObject:userNotes]; 

    NSMutableDictionary *final=[[NSMutableDictionary alloc]init]; 
    [final setValue:notes forKey:@"usernotes"]; 
    [final writeToFile:metaDataPath atomically:YES]; 

и мой PLIST выглядеть

enter image description here

как я могу решить эту проблему

enter image description here

+0

переопределение существующего массива с одним значением, вы должны перезаписать массив. Добавьте значения в существующий массив, затем обновите до plist. – iphonic

+0

i dont knw, как это сделать – Naveen

ответ

4

Позовите существующий массив из списка свойств, как показано ниже, но сначала убедитесь, что вы скопировали вы Plist в каталог документов или, в некоторой пишущей папке, как показано ниже

NSFileManager *fileManager=[NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *docPath=[[paths objectAtIndex:0] stringByAppendingString:@"yourplist.plist"]; 
BOOL fileExists = [fileManager fileExistsAtPath: docPath]; 
NSError *error = nil; 
if(!fileExists) 
{ 
    NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:@"yourplist" ofType:@"plist"]; 

    [fileManager copyItemAtPath:strSourcePath toPath:docPath error:&error];   

} 

NSString *path = docPath; 
NSMutableDictionary *plistdictionary = [[NSMutableDictionary alloc]initWithContentsOfFile:path]; 
NSMutableArray *notes=[plistdictionary objectForKey:@"usernotes"]; 
if(notes==nil){ 
    notes=[[NSMutableArray alloc] init]; 
} 
NSString *[email protected]"95"; 
NSString *[email protected]"12"; 
userNotes=[[NSMutableDictionary alloc]init]; 
[userNotes setValue:userNotesTextview.text forKey:@"notes"]; 
[userNotes setValue:bid forKey:@"bookid"]; 
[userNotes setValue:pnum forKey:@"pagenumber"]; 
[notes addObject:userNotes]; 

затем, наконец,

NSMutableDictionary *final=[[NSMutableDictionary alloc]init]; 
[final setValue:notes forKey:@"usernotes"]; 
[final writeToFile:docPath atomically:YES]; 

Примечание: Вы не можете ничего писать в MainBundle, так что лучше скопировать PLIST в папку Documents и использовать оттуда ..

+0

plistdictionar? это новый изменяемый словарь? – Naveen

+0

Обновлено мой ответ .. – iphonic

+0

Извините, что не работает – Naveen

1

потому что plist может хранить ценность только с уникальным ключом. если вы попытаетесь сохранить значение с тем же ключом, он заменит старый на новое значение. поэтому всегда сохранить новое значение с помощью нового ключа (например. item0, item1, item3 и т.д.)

следующие строки будут храниться два usernote с ключом @ "usernotes1" и @ "usernotes2" соответственно

[final setValue:notes forKey:@"usernotes1"]; 
[final setValue:notes forKey:@"usernotes2"]; 
+0

Вы имеете в виду, мне нужно проверить количество окончательных и установить значение nwe value count + 1 внутри цикла for для записи данных для цикла с ключом @ "usernote% d", i ?? – Naveen

+0

вместо того, чтобы давать 1,2,3 в userNotes, вы можете использовать цикл для генерации этого ... –

+0

оба варианта возможны в зависимости от ситуации, в которой вы храните свои данные. –

1

Plist структура выглядит следующим образом

enter image description here

Вы можете создать Класс модели UserNote.

#define kBookID @"bookid" 
#define kPageNumber @"pageNumber" 
#define kNotes @"notes" 

@interface UserNote : NSObject 

@property (nonatomic, copy) NSString *bookID; 
@property (nonatomic, copy) NSString *pageNumber; 
@property (nonatomic, copy) NSString *notes; 

- (id)initWithDictionary:(NSDictionary *)dictionary; 

+ (NSArray *)savedUserNotes; 
- (void)save; 

@end 

Initialize

- (id)initWithDictionary:(NSDictionary *)dictionary 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.bookID = dictionary[kBookID]; 
     self.pageNumber = dictionary[kPageNumber]; 
     self.notes = dictionary[kNotes]; 
    } 

    return self; 
} 

Найти путь документа из Plist файла в каталоге документов. Если файл plist отсутствует, создайте новый и верните путь.

+ (NSString *)userNotesDocumentPath 
{ 
    NSString *documentsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"UserNotes.plist"]; 

    NSFileManager *fileManger = [NSFileManager defaultManager]; 
    if (![fileManger fileExistsAtPath:documentsPath]) 
    { 
     NSString *bundleResourcePath = [[NSBundle mainBundle]pathForResource:@"UserNotes" ofType:@"plist"]; 
     NSArray *userNotes = [NSArray arrayWithContentsOfFile:bundleResourcePath]; 
     [userNotes writeToFile:documentsPath atomically:YES]; 
    } 

    return documentsPath; 

} 

Выбирает все сохраненные usernotes из файла plist.

+ (NSArray *)savedUserNotes 
{ 
    NSString *documentsPath = [self userNotesDocumentPath]; 
    NSArray *savedNotes = [NSArray arrayWithContentsOfFile:documentsPath]; 
    NSMutableArray *savedUserNotes = [@[] mutableCopy]; 
    for (NSDictionary *dict in savedNotes) { 
     UserNote *note = [[UserNote alloc]initWithDictionary:dict]; 
     [savedUserNotes addObject:note]; 
    } 

    return savedUserNotes; 

} 

Сохраняет usenote в Plist

- (NSDictionary *)userNoteDictionary 
{ 
    return @{kBookID:self.bookID,kPageNumber:self.pageNumber,kNotes:self.notes}; 
} 

- (void)saveUserNotesToPlist:(NSArray *)userNotes 
{ 
    NSMutableArray *mutableUserNotes = [@[] mutableCopy]; 
    for (UserNote *note in userNotes) { 
     NSDictionary *dict = [note userNoteDictionary]; 
     [mutableUserNotes addObject:dict]; 
    } 
    NSString *documentsPath = [UserNote userNotesDocumentPath]; 
    [mutableUserNotes writeToFile:documentsPath atomically:YES]; 
} 

#pragma mark - Save 

- (void)save 
{ 
    NSMutableArray *savedNotes = [[UserNote savedUserNotes] mutableCopy]; 
    [savedNotes addObject:self]; 
    [self saveUserNotesToPlist:savedNotes]; 
} 

В вас ViewController, где пользователь делает заметку

- (IBAction)saveUserNoteButtonPressed:(UIButton *)button 
{ 
    UserNote *note = [UserNote new]; 

    note.bookID = @"95"; 
    note.pageNumber = @"12"; 
    note.notes = self.userNotesTextview.text; 

    [note save]; 
} 

Demo Source Code

+0

это для вас? – Naveen

+0

@Naveen Да, конечно. Я включил исходный код в свой ответ. – Anupdas

+0

но как я могу дать входные данные от textview до кода ur? – Naveen

Смежные вопросы