plist没有按照输入的方式提供数据

时间:2013-08-04 12:33:11

标签: ios objective-c plist

在开始之前,我正在以编程方式创建plist

我在plist中以编程方式存储图像的路径名。保存时,我使用了NSLog,以下是我所拥有的

2013-08-04 15:25:24.044 XXX[12595:13d03] inserting data is 5===http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-07-42-37.25_tstdddd.png
2013-08-04 15:25:24.057 XXX[12595:13d03] inserting data is 4===http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-07-18-20.673_iphone_2.jpg
2013-08-04 15:25:24.086 XXX[12595:13d03] inserting data is 2===http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-07-21-03-14-29.292_Spare-Parts-summer-Ad-hyundai.jpg
2013-08-04 15:25:24.087 XXX[12595:13d03] inserting data is 1===http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-07-21-03-11-55.395_horizon.jpg
2013-08-04 15:25:24.089 XXX[12595:13d03] inserting data is 6===http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-08-03-29.371_2010.jpg

以id 5,4,2,1,6输入数据。

现在,当我阅读这些数据时,下面是我得到的内容。

2013-08-04 15:27:28.251 XXX[12595:13d03] fetching URL == http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-07-18-20.673_iphone_2.jpg
2013-08-04 15:27:28.252 XXX[12595:13d03] fetching URL == http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-07-42-37.25_tstdddd.png
2013-08-04 15:27:28.252 XXX[12595:13d03] fetching URL == http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-07-21-03-11-55.395_horizon.jpg
2013-08-04 15:27:28.252 XXX[12595:13d03] fetching URL == http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-08-04-08-03-29.371_2010.jpg
2013-08-04 15:27:28.252 XXX[12595:13d03] fetching URL == http://www.mysite.com/faces/ProjectUploadFiles/hotDeals/mobile_2013-07-21-03-14-29.292_Spare-Parts-summer-Ad-hyundai.jpg

表示在获取时我获得了4,5,1,6,2

的数据

当我双击plist时,我的数据有id排序,即我的数据为1,2,4,5,6。

任何想法为什么plist提供随机数据?

以下是生成的plist的屏幕截图。

enter image description here


编辑1

对于存储数据,以下是我的代码。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    news = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Offers.plist"];
    NSFileManager *fileManager = [NSFileManager defaultManager];


    NSError *error;
    if(![[NSFileManager defaultManager] removeItemAtPath:path error:&error])
    {
        //TODO: Handle/Log error
        NSLog(@"files not deleted...");
    } else {
        NSLog(@"files deleted...");
    }

    if (![fileManager fileExistsAtPath: path])
    {
        path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"Offers.plist"] ];
    }

    NSMutableDictionary *data002 = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

    if ([fileManager fileExistsAtPath: path])
    {
        data002 = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
    }
    else
    {
        // If the file doesn’t exist, create an empty dictionary
        data002 = [[NSMutableDictionary alloc] init];
    }
    int count;

    for (count = 0; count < (int)[news count]; count++)
    {
        [data002 setObject:[[news objectAtIndex:count] objectForKey:@"imagePath"] forKey:[[news objectAtIndex:count] objectForKey:@"id"]];
        [data002 writeToFile:path atomically:YES];

    }

    [data002 release];

}

答案

我所做的是代替NSMutableDictionary我使用了NSMutableArray并且完美无缺。

2 个答案:

答案 0 :(得分:0)

你plist是一个字典,它没有顺序,只有键和值。如果您需要存储订单,则更改为使用数组(字典)或使用其他文件存储订单。


data002是一本字典。这就是使你的plist成为字典的原因(当你打电话给writeToFile:时)。如果要维护相对顺序,则需要确定要采用的方法,然后按顺序创建NSArray个项目,并使用阵列上的writeToFile:进行保存。

答案 1 :(得分:0)

通常,为了维护顺序数据,您必须在plist文件中使用字符串数组,而不是直接将字符串插入根元素(这是一个字典)。或者,如果您希望存储更复杂的实体,我建议将它们编入索引并在单独的数组中单独引用索引以维持顺序。

enter image description here

点击“+”符号添加元素,然后从“类型”下的下拉菜单中选择“数组”

如果您在代码中执行此操作,只需在NSDictionary中插入一个NSArray作为对象,您将其保存为plist:

[data002 setObject:@[path1,path2,path3] forKey:@"orderedArray"];