核心数据按id获取数据顺序

时间:2013-05-07 19:43:44

标签: objective-c core-data

我试图为我的获取数据提供相同的顺序,因为我要求的所有时间,他得到另一个排序的数组,所以我试图按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查看数据库时,只有那里有数字。

我想到的另一种方法是使FORMCOMPONENTs直接获取新请求,而不是FORM one([form formComponents]),如下所示:

AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];

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:我不想避免为订单创建另一个字段的问题。如果我没有任何其他解决方案,那么我会这样做。

5 个答案:

答案 0 :(得分:2)

核心数据不是数据库。

内部核心数据当然使用PK。但Core Data不是数据库,它是一个模拟图形的系统。因此,不会发布“身份证信息”。寻找身份证是反概念的。

如果您的数据没有“自然顺序”,那么获取随机订单应该没有错。如果它有自然顺序,只需使用排序描述符。

如果您需要订单“创建日期”,只需添加属性creationDate并将其设置为-awakeFromInsert。 (顺便说一句:AFAIK它是一个都市传奇,PK总是提升。一个PK可能不是自动增量。)

答案 1 :(得分:2)

Core Data不会公开任何可用于排序的SQL样式数字ID。如果您不想添加要排序的属性,最简单的方法可能是将此关系配置为已排序。然后你得到一个NSOrderedSet的关系,你可以按照你想要的顺序保存个别实例。在Core Data模型编辑器中对关系进行排序,并在想要为关系添加新实例时使用mutableOrderedSetValueForKey:

答案 2 :(得分:1)

建议您为要为组件提供的ID /排序顺序添加字段。

或者,您可以通过选中CoreData编辑器中的复选框来使关系排序。这有一些额外的开销,但如果组件需要出现在多个列表中,这是唯一的选择。

直接干预SQLite并不是一种聪明的方法。

答案 3 :(得分:0)

您可以使用self作为排序关键字的排序描述符,按objectID进行排序。基础SQL将具有ORDER BY t0.Z_PKZ_PK是记录的内部ID(作为对象的NSManagedObjectID的最后一个组成部分)。

答案 4 :(得分:-2)

感谢您的帮助。我发现了我正在寻找的东西(我可以点这个例子) 我需要从sql直接获取PK,如果有人需要这样做,这里是代码: 只是不要忘记我们的朋友汤姆所说的:“这不是核心数据的工作方式”

-(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;
}