2010-09-14 41 views
1

我已经写了一些从plist文件中提取信息的代码,并且做了一些事情然后最终将这些数据弹出到表中。字典和plist文件

这一切工作正常,问题是我写的代码从资源文件夹中的plist文件拉数据,但实际的文件将通过操作创建并存储在内存中。从新位置拉出代码时,我需要一些帮助。

当前工作代码:

- (void) loadData{ 
// Load items 
NSString *error; 
NSPropertyListFormat format; 
NSString *path = [[NSBundle mainBundle] pathForResource:@"CalculatorData" ofType:@"plist"]; 
NSData *plistData = [NSData dataWithContentsOfFile:path]; 
NSArray *amountData = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 
NSDictionary *amountData = [NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 

if (amountData) { 
    self.amounts = [[NSMutableArray alloc] initWithCapacity:[amountData count]]; 
    result = 0; 
    for (NSDictionary *amountsDictionary in amountData) { 

     [self.amounts addObject:amountsDictionary]; 

     currentNumber = [[amountsDictionary objectForKey:@"Value"] floatValue]; 

     if ([[amountsDictionary objectForKey:@"Type"] isEqualToString:@"Plus"]) { 
      result = result + currentNumber; 
     } else { 
      result = result - currentNumber; 
     } 
    } 
    //Set main amount 
    NSString *msg = [NSString stringWithFormat:@"£%.2f",result]; 
    [lblAmount setText:msg]; 
} else { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Why not keep track of your income and expensies? Add new items below." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 
} 

我认为拉离新的文件位置的信息,我需要类似下面的东西,但似乎无法得到的输出与上面相同:

//Get file location 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

// read it back in with different dictionary variable 
NSMutableDictionary *amountData = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
if(amountData==nil){ 
    NSLog(@"failed to retrieve dictionary from disk"); 
} else { 
    NSLog(@"%@", amountData); 
} 

创建plist文件的代码(这也需要一点的工作,因为它总是目前覆盖了什么做过,当我想它添加一个新的数组):

-(void) addData { 

// create a dictionary to store a fruit's characteristics 
NSMutableDictionary *items = [[NSMutableDictionary alloc] init]; 
[items setObject:@"10" forKey:@"Value"]; 
[items setObject:@"tester" forKey:@"Description"]; 
[items setObject:@"Plus" forKey:@"Type"]; 

// create a dictionary to store all fruits 
NSMutableDictionary *plist = [[NSMutableDictionary alloc] init]; 
[plist setObject:items forKey:@"0"]; 

//Get file location 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

// write plist to disk 
[plist writeToFile:path atomically:YES]; 
} 

这也需要一点的工作,因为我想它是:

是涉及
<?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"> 
<array> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
    <dict> 
     <key>Date</key> 
     <string>27/9/10</string> 
     <key>Value</key> 
     <string>10.97</string> 
     <key>Description</key> 
     <string>PaperRound</string> 
     <key>Type</key> 
     <string>Plus</string> 
    </dict> 
</array> 
</plist> 

对不起,长职位,但希望要的一切。 对此的任何帮助将是伟大的。

回答

1

如果你想plist中的最外层元素是一个数组,然后在您发布创建的错误类型的对象的代码下面几行:

// create a dictionary to store all fruits 
NSMutableDictionary *plist = [[NSMutableDictionary alloc] init]; 
[plist setObject:items forKey:@"0"]; 

我还要提防离开陈旧的您的代码中的评论陈述,因为它们有时可能会导致您误导自己。这是你的addData方法的建议重写:

-(void)addData { 

    // Create a dictionary representing an item 
    // 
    NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"10", @"Value", 
          @"tester", @"Description", 
          @"Plus", @"Type", 
          nil]; 

    // Create an array of items. This must be an instance of NSArray or 
    // NSMutableArray if you want the corresponding element in your plist 
    // to be an array. 
    // 
    NSArray *items = [NSArray arrayWithObjects: item, nil]; 

    // Get file location (this part is fine). 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"saveBudget.plist"]; 

    // Write array of items to filesystem 
    [items writeToFile:path atomically:YES]; 
} 

做出道歉,我没有测试上面的代码,但它应该至少可以说明这一点。

+0

嗨Jlehr,谢谢你,简单的事情帮助这么多!最后还有一件事,我该如何添加到数组中,而不是替换?目前,当添加新项目时,它将覆盖当前项目? – jimbo 2010-09-15 07:59:44

+0

我已经设法解决了这个问题,通过先读取数据,然后添加新项目(addObject)到它的工作... – jimbo 2010-09-15 13:33:26

+0

嗨吉姆博士,对不起,我没有看到这一点。没错,要将对象添加到数组的末尾,可以使用'-addObject:';如果你想插入数组的其他地方,使用'-insertObject:atIndex:'。 – jlehr 2010-09-15 20:34:45