Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing array contents to a file

I've struggled with this all day using answers from here, but I cannot find a solution that is working for me, so I thought I'd ask for help:

I have an array of objects that I've extracted from an entity.

All I want to do is to write the objects to a file.

What I've come up with so far is this:

    NSLog(@" Exported Records: %i", [exportArray count]); 
    // the count here is 4 records.
    //Each record has about 8 elements. 
//I'm just trying to get this working with the first two elements right now

        NSString *writeString = nil;
        NSError *error = nil;
        int i = 0;
        NSString *key = nil;
        NSString *tempString = nil;
        for (i=0; i<[exportArray count]; i++)
        {
            tempString = [tempString stringByAppendingString: @" \n "];

            for (int j=0; j<3; j++)
            {
                if (j == 0)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"title"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"title"]];
                }
                if (j == 1)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"username"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"username"]];
                }
                writeString = [NSString stringWithFormat:tempString, key];
            }
        }

        // Write to the file
        [writeString writeToFile:dataFile atomically:YES
                    encoding:NSUTF8StringEncoding error:&error];
        if (error)
        {
            NSLog(@"%@", error);
        }

Right now, all I'm getting the the last item, so I'm overwriting the string. But, there must be a better method to achieve this. Please let me know if there is another answer here matches my question, or please, post some ideas.

UPDATE

When I log the exportArray, I get this:

"<ItemEntity: 0x1ddf6560> (entity: ItemEntity; id: 0x1ddf46d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6800> (entity: ItemEntity; id: 0x1ddf46e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2051> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6860> (entity: ItemEntity; id: 0x1ddf45d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p3075> ; data: <fault>)",
    "<ItemEntity: 0x1ddf68c0> (entity: ItemEntity; id: 0x1ddf45e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p5124> ; data: <fault>)"
)

When I log the actual values:

NSLog(@" Exported titles: %@", [exportArray valueForKey:@"title"]);
NSLog(@" Exported usernames: %@", [exportArray valueForKey:@"username"]);

I get correct results. I just don't know how to tie these and the other attributes together..

  Exported titles: (
    1,
    2,
    4,
    6
)
  Exported usernames: (
    ellis,
    david,
    bea,
    ian
)
like image 222
ICL1901 Avatar asked Nov 28 '22 16:11

ICL1901


2 Answers

If you just have NSDictionaries in your array, you can use writeToFile:atomically: which will save a file in .plist format (which is much easier to read than a CSV).

Check out the Apple Docs for NSArray, and a good write up on plists.

So you would end up having:

[exportArray writeToFile:fileName atomically:YES];

Edit: You cannot save a core data object to a file. So what you want to do is create an interim array with just the data you want, then write that to the file.

NSMutableArray* arrayToSave = [NSMutableArray arrayWithCapacity:exportArray.count];
[exportArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary* exportDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                [obj objectForKey:@"username"], @"username",
                                [obj objectForKey:@"title"], @"title", nil];
    [arrayToSave addObject:exportDict];
}];

[arrayToSave writeToFile:fileName atomically:YES];
like image 102
MishieMoo Avatar answered Dec 01 '22 06:12

MishieMoo


Use this,

[exportArray writeToFile:dataFile atomically:YES];

NSArray has the method writeToFile: to do this. Check the documentation here. This works fine if there are no custom objects inside the array.

In case you want to save only title or username(Even if it has custom objects in array), you can do it as:

NSArray *array1 = [exportArray valueForKey:@"title"];
[array1 writeToFile:dataFile atomically:YES];

or

NSArray *array2 = [exportArray valueForKey:@"username"];
[array2 writeToFile:dataFile atomically:YES];
like image 28
iDev Avatar answered Dec 01 '22 06:12

iDev