I've been trying to get to grips with Core Data and I'm having some difficulty with my fetched results. The problem is that I have 'Branch' objects which have a to-many relationship to 'Telephone' objects. When I return a 'Branch' and try to access all related 'Telephone' objects from the returned NSSet, I seem to only get one object back. See the code below which I'm using to try to see what's going on.
/***************************************************************************************
start testing the fetched objects
***************************************************************************************/
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
for (int i=0; i<[results count]; i++) {
NSString *sortcode = [[results objectAtIndex:i] valueForKey:#"sortcode"];
NSString *lat = [[results objectAtIndex:i] valueForKey:#"latitude"];
NSString *lon = [[results objectAtIndex:i] valueForKey:#"longitude"];
NSSet *phoneSet = [[results objectAtIndex:i] valueForKey:#"telephone"];
int phoneCount = [phoneSet count];
NSArray *phoneArray = [self arrayFromSet:[[results objectAtIndex:i] valueForKey:#"telephone"]];
for (int j=0; j<[phoneArray count]; j++) {
NSString *phoneNumber = [[phoneArray objectAtIndex:j] valueForKey:#"number"];
NSLog(#"%#,%i,%i",phoneNumber,[phoneArray count],phoneCount);
}
NSLog(#"%#,%#,%#",sortcode,lat,lon);
}
/***************************************************************************************
finish testing the fetched objects
***************************************************************************************/
This results in the following output:
2010-03-05 22:05:18.566 AIB[3175:207] 059 9151727,1,1
2010-03-05 22:05:18.566 AIB[3175:207] 933325,52.802288,-6.737655
Here's where I add the objects to the context:
// Add all telephones to this branch
for (int i=0; i<[telephoneArray count]; i++) {
[newTelephone setBranch:newBranch];
[newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:#"number"]];
[newBranch addTelephoneObject:newTelephone];
NSLog(#"i=%i and phone number=%#", i, [newTelephone valueForKey:#"number"]);
}
NSError *error;
if (![managedObjectContext save:&error]) {
// Handle the error.
NSLog(#"Save failed with error %#",error);
} else {
NSLog(#"Save was successful");
}
...and here's the output of the above
2010-03-05 22:15:03.217 AIB[3175:6837] i=0 and phone number=059 9151204
2010-03-05 22:15:03.218 AIB[3175:6837] i=1 and phone number=059 9151179
2010-03-05 22:15:03.218 AIB[3175:6837] i=2 and phone number=059 9151727
2010-03-05 22:15:03.231 AIB[3175:6837] Save was successful
The problem is in this code:
// Add all telephones to this branch
for (int i=0; i<[telephoneArray count]; i++) {
[newTelephone setBranch:newBranch];
[newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:#"number"]];
[newBranch addTelephoneObject:newTelephone];
NSLog(#"i=%i and phone number=%#", i, [newTelephone valueForKey:#"number"]);
}
The newTelephone object is the SAME for every iteration of the for loop.
Thus, this line is only adding one object to the set (it is added multiple times, but an NSSet doesn't allow duplicates and that's really not what you want anyway):
[newBranch addTelephoneObject:newTelephone];
Related
for(int i=0; i<[arrMaintenanceDetail count]; i++){
for(int j=0; j<[[arrMaintenanceCategory valueForKey:#"maintenanceCategory"] count]; j++){
if([[arrMaintenanceDetail objectAtIndex:i] isEqualToString:[[[arrMaintenanceCategory valueForKey:#"maintenanceCategory"]objectAtIndex:i] stringValue]]){
[arrTotalValues objectAtIndex:i] += [arrTotalValues insertObject:[[[arrMaintenanceCategory valueForKey:#"cost"] objectAtIndex:j] integerValue] atIndex:i];
}
}
}
I want to add (make addition of integer values) value from
[[[arrMaintenanceCategory valueForKey:#"cost"] objectAtIndex:j] integerValue];
Whenever loop changes its value.
I want new value from objectAtIndex:j to be added to its previous value and store it for future use.
I will have 4 objects in arrTotalValues (NSMutableArray).
So what should I do ??
You cannot keep integers in NSMutableArray. Use NSNumber to keep integer values in your NSMutableArray as objects.
You didn't provide enough information to give you 100% working code, but try something like that:
NSMutableArray* arrTotalValues = [NSMutableArray array];
for(int i=0; i<[arrMaintenanceDetail count]; i++)
{
NSNumber* totalValue = [NSNumber numberWithInt:0];
for(int j=0; j<[[arrMaintenanceCategory valueForKey:#"maintenanceCategory"] count]; j++)
{
if([[[arrMaintenanceDetail objectAtIndex:i] stringValue] isEqualToString:[[[arrMaintenanceCategory valueForKey:#"maintenanceCategory"] objectAtIndex:i] stringValue]])
{
int newTotalValue = [totalValue intValue] + [[[arrMaintenanceCategory valueForKey:#"cost"] objectAtIndex:j] integerValue];
totalValue = [NSNumber numberWithInt:newTotalValue];
}
}
[arrTotalValues addObject:totalValue];
}
I want to below effect,but I don't kown how to use NSMutableArray combine NSArray More than two?
1.my code
for (int i=0; i<[DateSortArry2 count]; i++) {
for (int j=0; j<[DateSortArry2Copy count]; j++) {
NSString *sectiondateStr2 = [NSString stringWithFormat:#"%#",[DateSortArry2Copy objectAtIndex:j]];
if ([[DateSortArry2 objectAtIndex:i] isEqualToString:sectiondateStr2]) {
[Arry addObject:sectiondateStr2];
}
}
[SumArry addObjectsFromArray:Arry];
[Arry removeAllObjects];
}
2.my code Result
SumArry:(
"20130227",
"20130227",
"20130227",
"20130226",
"20130226",
"20130226",
"20130225",
"20130225")
3.I want the results
SumArry:((
"20130227",
"20130227",
"20130227",
),
(
"20130226",
"20130226",
"20130226",
),
(
"20130225",
"20130225"
))
Your code repeatedly fills and empties the same array by adding its elements, but you need to preserve the structure with additional instances of NSArray. So, use a new NSArray for each section.
for (int i=0; i<[DateSortArry2 count]; i++) {
NSMutableArray *section = [NSMutableArray array];
for (int j=0; j<[DateSortArry2Copy count]; j++) {
NSString *sectiondateStr2 = [NSString stringWithFormat:#"%#",[DateSortArry2Copy objectAtIndex:j]];
if ([[DateSortArry2 objectAtIndex:i] isEqualToString:sectiondateStr2]) {
[section addObject:sectiondateStr2];
}
}
[SumArry addObject:section];
}
You can either store a reference to another array (or any type of object) in your array:
[myMutableArray addObject:otherArray];
Or concatinate the arrays.
[myMutableArray addObjectsFromArray:otherArray];
Both of which are documented in the documentation. By the looks of it the first approach is what you want since you want to have NSArray of NSMutableArray.
try this:
please tell me if it works.
thanks
NSString *str = #"";
for (int i=0; i<[DateSortArry2 count]; i++)
{
if (str isEqualToString:[DateSortArry2 objectAtIndex:i])
{
return;
}
else
{
NSMutableArray * Arry = [[NSMutableArray alloc] init];
str = [DateSortArry2 objectAtIndex:i]
for (int j=0; j<[DateSortArry2Copy count]; j++)
{
if ([[DateSortArry2 objectAtIndex:i] isEqualToString:str])
{
[Arry addObject:str];
}
}
[SumArry addObject:Arry];
[Arry removeAllObjects];
}
}
i have this code :
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i <[titleNews count]; ++i) {
TFHppleElement *someText =[titleNews objectAtIndex:i];
NSString *result = [someText content];
[arr addObject:result];
if ([[arr objectAtIndex:i]isEqualToString:#"-- : --"]) {
[arr replaceObjectAtIndex:i withObject:#"x"];
[arr addObject:#"/"];
}
NSLog(#"%#",[arr objectAtIndex:i]);
}
the (replaceObjectAtIndex: withObject:) work fine but the (addObject)method not working
You're presuming that the "result" that you add to the array will always be at index i. But the first time that you fall into your "if" body, you'll add an i+1 element ("/") and from then on everything will be off by one.
i had a problem with leak. In this editingSessionArray
in this line below:
NSMutableArray *sessionsArray = [[NSMutableArray alloc] initWithArray:[BBWorkoutSession fetchSessionDetail1:selectedWorkoutId]];
say that Method returns a objective-c object with a +1 retain count (owing reference):
were did i made the mistake.
Please help me
-(void)editingSessionsArray
{
[[BBAppController sharedInstance] updateLogWithString:[NSString stringWithFormat:#"BEGIN : %s", __PRETTY_FUNCTION__]];
if(selectedWorkoutId) {
// NSLog(#"the section id is : %#",selectedWorkoutId);
NSMutableArray *sessionsArray = [[NSMutableArray alloc] initWithArray:[BBWorkoutSession fetchSessionDetail1:selectedWorkoutId]];
/* condition for checking the selected workout id is existing or not */
if ([workOutSessionData count]) {
for (int i= 0; i< [workOutSessionData count] ; i++) {
if ([[[workOutSessionData objectAtIndex:i] allKeys] containsObject:[NSString stringWithFormat:#"%#",selectedWorkoutId]]) {
[workOutSessionData removeObjectAtIndex:i];
return;
}
}
}
/* If console comes here the workout id is not existed in the main array */
[mainDict setValue:sessionsArray forKey:[NSString stringWithFormat:#"%#",selectedWorkoutId]];
NSMutableDictionary *workoutsList = [[NSMutableDictionary alloc]initWithObjectsAndKeys:sessionsArray,[NSString stringWithFormat:#"%#",selectedWorkoutId],nil] ;
[workOutSessionData addObject:workoutsList];
[workoutsList release];
[sessionsArray release];
}
[[BBAppController sharedInstance] updateLogWithString:[NSString stringWithFormat:#"END : %s", __PRETTY_FUNCTION__]];
}
If your code goes here:
if ([workOutSessionData count]) {
for (int i= 0; i< [workOutSessionData count] ; i++) {
if ([[[workOutSessionData objectAtIndex:i] allKeys] containsObject:[NSString stringWithFormat:#"%#",selectedWorkoutId]]) {
[workOutSessionData removeObjectAtIndex:i];
return;
}
}
}
you return without releasing workoutList and sessionArray.
You should allocate your sessionArray with an autorelease
NSMutableArray *sessionsArray = [[[NSMutableArray alloc] initWithArray:[BBWorkoutSession fetchSessionDetail1:selectedWorkoutId]] autorelease];
i have an array like
[chapter,indent,left,indent,nonindent,chapter,chapter,indent,indent,left];
i need to find indexes of duplicates and also non duplicate elements .
how to do this...........give some sample code or logic......
thanks in advance
iam using objective c.....
NSArray *myWords = [string componentsSeparatedByString:#"class=\""];
int count_var=[myWords count];
tmp1=#"";
for(int i=1;i<count_var;i++)
{
str=[NSString stringWithFormat:#"\n%#",[myWords objectAtIndex:i]];
class=[str componentsSeparatedByString:#"\""];
NSString *tmp=[NSString stringWithFormat:#"%#",[class objectAtIndex:0]];
tmp1=[[NSString stringWithFormat:#"%#",tmp1] stringByAppendingString:[NSString stringWithFormat:#"%#",tmp]];
}
t1.editable=NO;
t1.text=tmp1;
NSArray *tempo=[[NSArray alloc]init];
tempo=[tmp1 componentsSeparatedByString:#"\n"];
tempCount=[tempo count];
this is my sample code...in this the array tempo contains all objects from that array i want to get index of duplicate strings≥.
You could build a dictionary mapping the objects to index sets. For every index set, a -count of 1 means no duplicates, > 1 means there are duplicates.
NSArray *arr = [NSArray arrayWithObjects:...];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSUInteger i=0; i<[arr count]; ++i) {
id obj = [arr objectAtIndex:i];
NSMutableIndexSet *ids = [dict objectForKey:obj];
if (!ids) {
ids = [NSMutableIndexSet indexSet];
[dict setObject:ids forKey:obj];
}
[ids addIndex:i];
}
NSLog(#"%#", dict);