プロパティリストの保存と復元


リスト 1 は、プロパティ・リストを作成して XML に変換し、ディスクに書き込んだ後、保存された XML を使用して元のデータ構造体を再作成する方法を示しています。CFDictionary オブジェクトの使用の詳細については、Core Foundation 用 Collections プログラミングトピックス を参照してください。


リスト 1 : プロパティリストデータの保存と復元


#include <CoreFoundation/CoreFoundation.h>
 
#define kNumKids 2
#define kNumBytesInPic 10
 
CFDictionaryRef CreateMyDictionary(void);
CFPropertyListRef CreateMyPropertyListFromFile(CFURLRef fileURL);
void WriteMyPropertyListToFile(CFPropertyListRef propertyList, CFURLRef fileURL);
 
int main () {
 
    // Construct a complex dictionary object;
    CFPropertyListRef propertyList = CreateMyDictionary();
 
    // Create a URL specifying the file to hold the XML data.
    CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                           CFSTR("test.txt"),      // file path name
                           kCFURLPOSIXPathStyle,   // interpret as POSIX path
                           false);                 // is it a directory?
 
    // Write the property list to the file.
    WriteMyPropertyListToFile(propertyList, fileURL);
    CFRelease(propertyList);
 
    // Recreate the property list from the file.
    propertyList = CreateMyPropertyListFromFile(fileURL);
 
    // Release objects we created.
    CFRelease(propertyList);
    CFRelease(fileURL);
    return 0;
}
 
CFDictionaryRef CreateMyDictionary(void) {
 
    // Create a dictionary that will hold the data.
    CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
                                       &kCFTypeDictionaryKeyCallBacks,
                                       &kCFTypeDictionaryValueCallBacks);
 
    /*
     Put various items into the dictionary.
     Values are retained as they are placed into the dictionary, so any values
     that are created can be released after being added to the dictionary.
    */
 
    CFDictionarySetValue(dict, CFSTR("Name"), CFSTR("John Doe"));
 
    CFDictionarySetValue(dict, CFSTR("City of Birth"), CFSTR("Springfield"));
 
    int yearOfBirth = 1965;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &yearOfBirth);
    CFDictionarySetValue(dict, CFSTR("Year Of Birth"), num);
    CFRelease(num);
 
    CFStringRef kidsNames[kNumKids];
    // Define some data.
    kidsNames[0] = CFSTR("John");
    kidsNames[1] = CFSTR("Kyra");
    CFArrayRef array = CFArrayCreate(kCFAllocatorDefault,
                           (const void **)kidsNames,
                           kNumKids,
                           &kCFTypeArrayCallBacks);
    CFDictionarySetValue(dict, CFSTR("Kids Names"), array);
    CFRelease(array);
 
    array = CFArrayCreate(kCFAllocatorDefault, NULL, 0, &kCFTypeArrayCallBacks);
    CFDictionarySetValue(dict, CFSTR("Pets Names"), array);
    CFRelease(array);
 
    // Fake data to stand in for a picture of John Doe.
    const unsigned char pic[kNumBytesInPic] = {0x3c, 0x42, 0x81,
             0xa5, 0x81, 0xa5, 0x99, 0x81, 0x42, 0x3c};
    CFDataRef data = CFDataCreate(kCFAllocatorDefault, pic, kNumBytesInPic);
    CFDictionarySetValue(dict, CFSTR("Picture"), data);
    CFRelease(data);
 
    return dict;
}
 
void WriteMyPropertyListToFile(CFPropertyListRef propertyList, CFURLRef fileURL) {
 
    // Convert the property list into XML data
    CFErrorRef myError;
    CFDataRef xmlData = CFPropertyListCreateData(
                 kCFAllocatorDefault, propertyList, kCFPropertyListXMLFormat_v1_0, 0, &myError);
    // Handle any errors
 
    // Write the XML data to the file.
    SInt32 errorCode;
    Boolean status = CFURLWriteDataAndPropertiesToResource(
                        fileURL, xmlData, NULL, &errorCode);
 
    if (!status) {
        // Handle the error.
    }
    CFRelease(xmlData);
    CFRelease(myError);
}
 
CFPropertyListRef CreateMyPropertyListFromFile(CFURLRef fileURL) {
 
    // Read the XML file
    CFDataRef resourceData;
    SInt32 errorCode;
    Boolean status = CFURLCreateDataAndPropertiesFromResource(
               kCFAllocatorDefault, fileURL, &resourceData,
               NULL, NULL, &errorCode);
 
    if (!status) {
        // Handle the error
    }
    // Reconstitute the dictionary using the XML data
    CFErrorRef myError;
    CFPropertyListRef propertyList = CFPropertyListCreateWithData(
                          kCFAllocatorDefault, resourceData, kCFPropertyListImmutable, NULL, &myError);
 
    // Handle any errors
 
    CFRelease(resourceData);
    CFRelease(myError);
    return propertyList;
}


リスト 2リスト 1 で作成された xmlData の内容がスクリーンに表示された場合の外観を示しています。


リスト 2 : サンプルプログラムで作成された XML ファイルの内容


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Year Of Birth</key>
    <integer>1965</integer>
    <key>Pets Names</key>
    <array/>
    <key>Picture</key>
    <data>
        PEKBpYGlmYFCPA==
    </data>
    <key>City of Birth</key>
    <string>Springfield</string>
    <key>Name</key>
    <string>John Doe</string>
    <key>Kids Names</key>
    <array>
        <string>John</string>
        <string>Kyra</string>
    </array>
</dict>
</plist>


前の章 次の章



目次
Xcode 10 の新機能

  • Core Foundation 用プロパティリストプログラミングトピックへの序言
  • この文書の構成
    プロパティリストの構造と内容
    プロパティリストの作成
    プロパティリストの保存と復元
    プロパティリストでの数値の使用
    プロパティリストの XML タグ
    文書改訂履歴












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)