我试图为我的获取数据提供相同的顺序,因为我要求的所有时间,他得到另一个排序的数组,所以我试图按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:我不想避免为订单创建另一个字段的问题。如果我没有任何其他解决方案,那么我会这样做。
答案 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_PK
,Z_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;
}