2013-05-07 2 views
0

언제나 요청하기 때문에 다른 정렬 된 배열을 얻으므로 ID로 주문하려고하지만 ' 티.핵심 데이터가 ID로 데이터 순서를 가져옵니다

내 상황 : 나는 2 개 모델, FORM 및 FormComponent를 1 FORM이 가지고있는 많은 FormComponent를 나는 할 때 :

Form *form = ...; 
[form formComponents]; //I get all the components but each time I run I get with a differente order 

어떻게 생각 위해이 경우 내가 ORDER에 대한 어떤 분야가 없습니다 ? android에서 ID로이 작업을 수행 했으므로이 제안이있는 분야가 없습니다.

sortWithComparator를 사용하여 배열을 정렬하려고했지만 숫자 ID (숫자가 아니라 [obj objectID]와 함께 제공되는 전체 문자열)를 가져올 수 없기 때문에이 작업을 수행 할 수 없습니다. 이것은 sqlite3을 사용하여 데이터베이스에 번호가있을 때만 재미 있기 때문에 재미 있습니다.

I에 대해 생각하는 다른 방법은 FORMCOMPONENTs하지 FORM 온 ([형태 formComponents])에 의해, 새로운 요청을 직접 얻을 수있다,이 같은

AppDelegate에 * AppDelegate에 = [[UIApplication sharedApplication] 대리자];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"FormComponent" inManagedObjectContext:[appDelegate managedObjectContext]]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
//SOME PREDICATE WITH THE FORM 
[request setPredicate:predicate]; 
NSError *error = nil; 
NSMutableArray *arrayComps = (NSMutableArray*) [[appDelegate managedObjectContext] executeFetchRequest:request error:&error]; 

누구나 아이디어가 있으십니까? 감사.

--- 편집 ---

PS : 나는 주문에 대한 다른 필드를 생성하는 문제를 방지하고 싶지 않아요. 다른 솔루션이 없으면이 작업을 수행 할 것입니다.

+1

당신은 당신이 그들을 순서대로 원한다고하지만, 당신은 그들을 어떤 순서로 원합니까? 어떻게 분류 될 것으로 기대합니까? 객체 ID로 정렬하는 것은 의미가 없습니다. 기본적으로 객체에 묶여있는 UUID이기 때문입니다. –

+0

ID로 주문하고 싶습니다. 어떤 오브젝트를 먼저 추가하면이 오브젝트는 다음 ID보다 작은 ID를 갖게됩니까? 그래서 ID로 주문한 경우 주문을 받는데 구성 요소를 추가합니다. 알다? – kavain

+2

그건 코어 데이터가 작동하는 방식이 아닙니다. –

답변

-2

도움 주셔서 감사합니다. 내가 찾고있는 것을 찾았습니다. (예를 들면 이것으로 주문할 수 있습니다) 아무도 이것을해야한다면, 여기 코드가 있습니다 : 그냥 우리 친구 Tom이 말한 것을 잊지 마세요. "핵심 데이터가 작동하는 방식이 아닙니다"

-(NSMutableArray*) readDatabase { 
    NSLog(@"READ"); 
    sqlite3 *database; 

    NSMutableArray *components = [[NSMutableArray alloc] init]; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"Model.sqlite"]; 
    // Open the database from the users filessytem 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
     NSLog(@"SQLITE_OK"); 
     // Setup the SQL Statement and compile it for faster access 
     const char *sqlStatement = "select * from zformcomponent"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
      // Loop through the results and add them to the feeds array 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       // Read the data from the result row 
       int aPK = sqlite3_column_int(compiledStatement, 0); 
       //NSString *aDescription = [NSString stringWithUTF8String: (char *)sqlite3_column_text(compiledStatement, 2)]; 
       //NSString *aImageUrl = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)]; 
       NSLog(@"PK: %d",aPK); 
       //Animal *animal = [[Animal alloc] initWithName:aName description:aDescription url:aImageUrl]; 
       //[animals addObject:animal]; 
      } 
     } 
     sqlite3_finalize(compiledStatement); 

    } 
    sqlite3_close(database); 

    return components; 
} 
2

핵심 데이터는 데이터베이스가 아닙니다.

내부 코어 데이터는 물론 PK를 사용합니다. 그러나 핵심 데이터는 데이터베이스가 아니며 그래프를 모델링하는 시스템입니다. 따라서 "ID 정보"는 게시되지 않습니다. ID를 찾는 것은 반 개념적입니다.

데이터에 "자연 순서"가없는 경우 임의 순서를 가져 오는 데는 아무런 문제가 없어야합니다. 자연 순서가있는 경우 정렬 설명자를 사용하십시오.

주문 "생성 날짜"가 필요한 경우 creationDate 속성을 추가하고 -awakeFromInsert에 설정하면됩니다. (BTW : AFAIK 그것은 PK가 항상 제기하는 도시의 전설이며, PK는 자동 증가가 아닌 다른 것일 수 있습니다.)

2

코어 데이터는 정렬에 사용할 수있는 모든 SQL 스타일 숫자 ID를 노출하지 않습니다. 정렬 할 속성을 추가하지 않으려면이 관계를 순서대로 구성하는 것이 가장 쉽습니다. 그런 다음 관계에 대해 NSOrderedSet을 얻고 원하는 순서대로 개별 인스턴스를 유지할 수 있습니다. 관계에 새 인스턴스를 추가하려면 코어 데이터 모델 편집기에서 관계를 순서화하고 mutableOrderedSetValueForKey:을 사용하십시오.

+0

hmmm 나는 이것을 좋아했다. 나는 이것을 어떻게 하는가? 나는 대략 찾을 것이다 그러나 당신이 약간 부호를 둘 수있는 경우에 나는 평가한다. 감사. =) – kavain

1

구성 요소에 제공하려는 ID/정렬 순서 필드를 추가하는 것이 좋습니다.

또는 CoreData 편집기의 확인란을 선택하여 관계를 정렬 할 수 있습니다. 이것에는 약간의 오버 헤드가 있지만 구성 요소를 여러 목록에 표시해야하는 경우 유일한 옵션입니다.

직접 SQLite로 간섭하는 것은 현명한 방법이 아닙니다.

관련 문제