0

我试图让我的获取数据始终保持相同的顺序,因为在我请求的所有时间,他都会得到另一个排序数组,所以我试图按 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 来查看数据库时,那里只有数字。

我想到的另一种方法是通过新请求直接获取 FORMCOMPONENT,而不是通过 FORM one([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:我不想避免为订单创建另一个字段的问题。如果我没有任何其他解决方案,那么我会这样做。

4

5 回答 5

3

您可以使用self作为排序键的排序描述符按 objectID 排序。底层 SQL 将具有ORDER BY t0.Z_PK,Z_PK作为记录的内部 ID(作为对象的最后一个组件找到NSManagedObjectID)。

于 2018-10-18T20:00:31.887 回答
2

核心数据不是数据库。

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

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

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

于 2013-05-07T20:29:33.833 回答
2

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

于 2013-05-07T22:48:09.680 回答
1

推荐的方法是为您想要提供给组件的 ID/排序顺序添加字段。

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

直接使用 SQLite 并不是一个聪明的方法。

于 2013-05-10T16:47:04.423 回答
-2

谢谢您的帮助。我找到了我正在寻找的东西(例如,我可以订购)我需要直接从 sql 获取 PK,如果有人需要这样做,这里是代码:只是不要忘记我们的朋友 Tom 说过的话:“那是不是 Core Data 的工作方式”

-(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;
}
于 2013-05-10T16:38:11.917 回答