2013-02-12 2 views
1

У меня есть вопрос о чтении/записи plist. Я использую этот Cose для чтения PLISTЧтение/запись plist

NSString *strFilePath = [ [NSBundle mainBundle] pathForResource:@"miodb" ofType:@"plist" ] ; 

NSMutableDictionary *dictMioDB = [[NSMutableDictionary alloc] initWithContentsOfFile:strFilePath] ; 

NSString *strValue ; 
strValue = [dictMioDB objectForKey: @"stringa1" ] ; 
NSLog(@"%@" , strValue) ; 

А для записи списка свойств я использую этот код:

NSString *strFilePath = [ [NSBundle mainBundle] pathForResource:@"miodb" ofType:@"plist" ] ; 
NSLog(@"%@" , strFilePath) ; 

NSMutableDictionary *dictMioDB = [[NSMutableDictionary alloc] initWithContentsOfFile:strFilePath] ; 

NSString *strTextField = [NSString stringWithFormat: @"%@" , [txtField text] ] ; 

// ga - salvataggio del valore nella chiave nel NSMutableDictionary 
[dictMioDB setValue: strTextField forKey:@"stringa1"]; 
[dictMioDB writeToFile: strFilePath atomically:YES]; 

Теперь проблема, что PLIST должен быть сохранен в директории Documents Таким образом, я использовал этот код :

//percorso file su cartella documents 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [documentPaths objectAtIndex:0]; 
NSString *path = [documentsDir stringByAppendingPathComponent:@"iOre.sqlite"]; 
    //[[NSFileManager defaultManager] removeItemAtPath:path error:nil]; 

//controllo se il file esiste 
if(![[NSFileManager defaultManager] fileExistsAtPath:path]) 
{ 
    //se non esiste lo copio nella cartella cosuments 
    NSString *pathLocale=[[NSBundle mainBundle] pathForResource:@"iOre" ofType:@"sqlite"]; 
    if ([[NSFileManager defaultManager] copyItemAtPath:pathLocale toPath:path error:nil] == YES) 
    { 
     NSLog(@"copia eseguita"); 
    } 
} 

Теперь у меня есть соединить две части кодов в этом:

//percorso file su cartella documents 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [documentPaths objectAtIndex:0]; 
NSString *path = [documentsDir stringByAppendingPathComponent:@"LevelsD.plist"]; 
[[NSFileManager defaultManager] removeItemAtPath:path error:nil]; 

NSString *pathLocale; 

//controllo se il file esiste 
if(![[NSFileManager defaultManager] fileExistsAtPath:path]) 
{ 
    //se non esiste lo copio nella cartella documents 
    pathLocale=[[NSBundle mainBundle] pathForResource:@"LevelsD" ofType:@"plist"]; 
    if ([[NSFileManager defaultManager] copyItemAtPath:pathLocale toPath:path error:nil] == YES) 
    { 
     NSLog(@"copia eseguita"); 
    } 
} 

// ga - trovo la posizione del .plist 
//NSString *strFilePath = [ [NSBundle mainBundle] pathForResource:@"LevelsD" ofType:@"plist" ] ; 
NSLog(@"%@" ,documentsDir) ; 

// ga - copio tutto il .plist (la root è un Dictionary) in un NSMutableDictionary 
NSMutableDictionary *dictMioDB = [[NSMutableDictionary alloc] initWithContentsOfFile:documentsDir] ; 

NSString * txtField = @"1"; 

//NSString *strTextField = [NSString stringWithFormat: @"%@" , txtField ] ; 

// ga - salvataggio del valore nella chiave nel NSMutableDictionary 
[dictMioDB setValue: txtField forKey:@"LevelHere1"]; 
[dictMioDB writeToFile: pathLocale atomically:YES]; 

Это не работает, но теперь у меня есть некоторые сомнения. В моем файле plist я не вижу никаких изменений, но возможно, что значение «txtField» было сохранено в «dictMioDB»? Как я могу увидеть, была ли запись/строка вставлена ​​в мой plis? Другое сомнение: когда я пишу что-то в папку Document с симулятором, данные будут удалены, когда я закрою это или когда я буду повторно компилировать приложение? В то время как в Iphone эти данные будут удалены при удалении приложения? Правильно? Последний дублет: когда я прочитаю plist, который находится в папке с документами, я могу использовать первый код, который автоматически ищет путь к plist?

ответ

0

При записи файла вы ошибаетесь, так как вы не можете записать файл в основной комплект. Он должен быть написан в каталоге документов:

+ (NSString *) getFilePathInDocsDir: (NSString *)fileName 
{ 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                   NSUserDomainMask, YES); 

    NSString *docsDir = documentPaths[0]; 
    NSString *filePathInDocsDir = [docsDir stringByAppendingPathComponent:fileName]; 
    return filePathInDocsDir; 
} 

Поэтому использовать эту функцию и записать файл на возвращенного пути только, а не в главном расслоении

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