Intrebare Core Data
  [ Ignoră ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06

Am si eu un UITableView ce foloseste Core Data pentru datasource.
Dupa ce execut un fetched request salvez datele intru-un NSMutableArray.
Vreau sa pot face reorder in tabel iar in implementarea metodei tableView:moveRowAtIndexPath:toIndexPath: in mod normal apelam retain pe obiectul de la index-ul vechi, il stergeam din array apoi il introduceam la index-ul nou in array si apelam release.
As vrea sa stiu daca pot face la fel cand folosesc Core Data, adica in array sunt NSManagedObjects.
Din ce am citit despre memory management la Core Data am inteles ca un NSManagedobjectContext are referinte week catre toate obiectele,deci ma gandesc ca in momentul in care sterg un obiect din array inteleg ca el dispare si din context?
Pentru a sterge un obiect din context stiu ca trebuie apelata metoda deleteObject: a context-ului apoi se salveaza context-ul.
Multumesc anticipat.

 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06

Implementarea ar arata cam asa

- (voidloadItemsFromDatabase
{
    NSFetchRequest 
*fetchRequest [[NSFetchRequest alloc] init];
    
NSEntityDescription *entityDesc [NSEntityDescription entityForName: @"MyEntityClass" inManagedObjectContext:self.managedObjectContext];
    
[fetchRequest setEntityentityDesc];
 
    
NSError *error nil;
    
NSArray *result [self.managedObjectContext executeFetchRequestfetchRequest error: &error;];
    
[fetchRequest release];
    if(
error != nil)
    
{
        NSLog
(@"%@",error);
        
abort();
    
}
    
if([result count] 0)
        
self.myArray [NSMutableArray arrayWithArrayresult];
}
 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    NSLog
(@"%@",NSStringFromSelector(_cmd));
    
NSManagedObject *obj [[self.myArray objectAtIndexfromIndexPath.row] retain];
    
[self.myArray removeObjectAtIndexfromIndexPath.row];
    
[self.myArray insertObjectobj atIndextoIndexPath.row];
    
[obj release];
   
    
[self saveContext];
 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 2 ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06

Legat de aceasi idee mai am o metoda swipeAction pentru “Swipe to delete”
Implementarea arata asa:

- (voidswipeAction: (UISwipeGestureRecognizer *) recognizer
{
    NSLog
(@"%@",NSStringFromSelector(_cmd));
    
MyCell *cell = (MyCell *)recognizer.view;
    
NSIndexPath *indexPath [self.myTableView indexPathForCellcell];
    
    
NSManagedObject *obj [[self.tasks objectAtIndexindexPath.row] retain];
    
BOOL completed [[obj valueForKey: @"completed"] boolValue];
    
NSIndexPath *indexPathForInsert nil;
    if(
completed == YES)
    
{
        [obj setValue
[NSNumber numberWithBoolNO] forKey: @"completed"];
        
indexPathForInsert indexPath;
    
}
    
else
    
{
        [obj setValue
[NSNumber numberWithBoolYES] forKey: @"completed"];
        
[obj setValue[NSDate date] forKey: @"checkDate"];
        
[self.tasks removeObjectAtIndexindexPath.row];
        
[self.tasks addObject:obj];
        
indexPathForInsert [NSIndexPath indexPathForRow: ([self.tasks count] 1inSection:0];
    
}

    [obj release]
;
    
[self saveContext];
    
    
[self.myTableView beginUpdates];
    
[self.myTableView deleteRowsAtIndexPaths[NSArray arrayWithObjectindexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    
[self.myTableView insertRowsAtIndexPaths[NSArray arrayWithObjectindexPathForInsert] withRowAnimation:UITableViewRowAnimationAutomatic];
    
[self.myTableView endUpdates];
 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 3 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Ai putea utiliza NSSortDescriptor pentru NSFetchRequest
Eu cred ca cel mai bine sortezi la interogare , nu te chinui cu rezultatul .

ceva de genul

NSSortDescriptor *sortare [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES]

[fetchRequest setSortDescriptors
:sortare]

undeva prin viewDidLoad , si in - (void)tableView o sa ai rezultatul gata sortat

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 4 ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06
NaspaNick - 26 Iulie 2012 01:14 PM

Ai putea utiliza NSSortDescriptor pentru NSFetchRequest
Eu cred ca cel mai bine sortezi la interogare , nu te chinui cu rezultatul .

ceva de genul

NSSortDescriptor *sortare [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES]

[fetchRequest setSortDescriptors
:sortare]

undeva prin viewDidLoad , si in - (void)tableView o sa ai rezultatul gata sortat


Merci, dar nu e vorba doar de sortare pentru ca de ex la metoda de swipe am cam aceasi problema, adica trebuie sa sterg un managed object din array de la un anumit index si sa il introduc la alt index.
Codul compilat asa pare ok dar vroiam sa stiu parerea cuiva care a lucrat cu Core Data.
De fapt ce ma intereseaza pe mine e daca in momentul in care sterg un managed object din array daca el mai exista in memorie pentru ca dupa cum am spus(asa am citit din documentatia apple) context-ul are referinte week catre obiecte, are referinte strong doar daca un obiect este editat sau daca ii este modificat vreun atribut.

 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 5 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Oamenii astia de la Apple au facut exact ca tine <<Visit Apple!>>
De unde putem concluziona ca nu trebuie sa iti faci probleme smile

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 6 ]
Avatar
RankRankRankRank
Sr. Member
Din: Bucuresti
Macuser din: 22.09.06
NaspaNick - 26 Iulie 2012 02:03 PM

Oamenii astia de la Apple au facut exact ca tine <<Visit Apple!>>
De unde putem concluziona ca nu trebuie sa iti faci probleme smile


Pai fara core data da, asta e solutia merge fara problemele.
Am facut acum multe teste cu multe NSLog-uri si am vazut dupa fiecare pas retain count-ul.
Treaba sta in felul urmator:
1. Daca las codul cum l-am facut cu retain si release la sfarsit pana sa salvez context-ul e ok.
2. Acum e partea ciudata:

// daca retain count-ul e 1 in acest moment, dupa ce sterg manage object-ul din array retain count-ul va ramane tot 1 (probabil ramane in NSManagedObjectContext, cu toate ca ar trebui sa fie week reference).
// daca retain count-ul e 2 in acest moment (daca am apleat mai devreme retain), dupa ce sterg manage object-ul din array retain count-ul va scadea de la 2 la 1. asta e de inteles dar de ce nu se intampa asta si mai sus??? sa scada e la 1 la 0 ?
[self.tasks removeObjectAtIndexfromIndexPath.row];
[self.tasks insertObjectobj atIndextoIndexPath.row];
// dupa insert retain count-ul creste cu 1 
 Semnătură 

A man should look for what is, and not for what he thinks should be.—Albert Einstein

Profil
 
  [ Ignoră ]   [ # 7 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

Probabil din cauza faptului ca ești încă în editmode.
După stergerea primului rând ieși din edit mode (done) și vezi dacă mai ai count=1

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil