Leggere e scrivere Dictionary, String, Array in file plist (Property List)

iPad, iPhone, MacOSX, Object-C Soft! Commenta l'articolo


I file Property lists sono molto comuni per una applicazione iPhone. Vediamo uno tramite l’esempio qui sotto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion>/key>
  <string>en>/string>
  <key>CFBundleDisplayName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundleIdentifier</key>
  <string>com.3Sixty.Test</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
 
  ...
 
  <key>UISupportedInterfaceOrientations</key>
  <array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
  </array>
</dict>
</plist>


Un file di proprietà è un dizionario del tipo key-value. Nell’esempio l’ultima coppia è un array come valore dell’oggetto.
iOS prevede dei metodi semplici per gestire questo tipo di file. Ad esempio il codice qui sotto crea un dictionary contenente tre Array:

NSArray *array1 = [NSArray arrayWithObjects:@"string1", @"string2", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"string3", @"string4", nil];
NSArray *array3 = [NSArray arrayWithObjects:@"string5", @"string6", nil];
 
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:array1 forKey:@"Array1"];
[dictionary setObject:array2 forKey:@"Array2"];
[dictionary setObject:array3 forKey:@"Array3"];

Serializziamo il dictionary:

NSString *error;   
// serializzazione
NSData *data = [NSPropertyListSerialization dataFromPropertyList:dictionary ]
  format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorString];
 
// cartella di destinazione
NSString  *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.xml"];
 
// scrive data su file
[data writeToFile:path atomically:YES];

Questo il risultato di test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Array1</key>
  <array>
    <string>string1</string>
    <string>string2</string>
  </array>
  <key>Array2</key>
  <array>
    <string>string3</string>
    <string>string4</string>
  </array>
  <key>Array3</key>
  <array>
    <string>string5</string>
    <string>string6</string>
  </array>
</dict>
</plist>

Adesso facciamo l’operazione inversa, leggiamo il contenuto di un file di proprietà:

NSString *error;  
NSPropertyListFormat format;   
 
// Build path to the property list (xml file)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
if ([paths count] > 0)
{
  // The file saved previously
  NSString  *plistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"test.xml"];
 
  // Check for existence of the file
  if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath])
  {
    // Read the file
    NSData *data = [NSData dataWithContentsOfFile:plistPath];   
 
    // Saved as dictionary object, so cast from id to dictionary is safe
    NSDictionary *plist = [NSPropertyListSerialization propertyListFromData:data 
        mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];  
 
    NSLog(@"plist: %@", plist);
  }
}

Buon lavoro

Scrivi un Commento

Home | Graffiti e Disegni | Educazione | Chi siamo | Blog | Progetti | Contatti
RSS Feed Comments RSS Accedi