Iphone SQLite记录未按使用核心数据创建的顺序保存?

Iphone SQLite记录未按使用核心数据创建的顺序保存?,iphone,core-data,Iphone,Core Data,在检查由下面的代码生成的sqlite数据库时,我发现核心数据似乎没有按照创建对象(记录)的顺序保存对象 -(void) CreateData { // Create an organization NSManagedObjectContext *context = [self managedObjectContext]; NSEntityDescription *org_entity = [NSEntityDescription entityForName:@"Organization" in

在检查由下面的代码生成的sqlite数据库时,我发现核心数据似乎没有按照创建对象(记录)的顺序保存对象

-(void) CreateData
{
// Create an organization

NSManagedObjectContext *context = [self managedObjectContext];
NSEntityDescription *org_entity = [NSEntityDescription entityForName:@"Organization" inManagedObjectContext:context];
NSManagedObject *organization = [NSEntityDescription insertNewObjectForEntityForName:[org_entity name] inManagedObjectContext:context];

[organization setValue:@"MyCompany" forKey:@"name"];
[organization setValue:[NSNumber numberWithInt:[organization hash]] forKey:@"id"];


// Create several people

NSEntityDescription *person_entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
NSManagedObject *john = [NSEntityDescription insertNewObjectForEntityForName:[person_entity name] inManagedObjectContext:context];

[john setValue:[NSNumber numberWithInt:[john hash]]  forKey:@"id"];
[john setValue:@"John" forKey:@"name"];


NSManagedObject *jane = [NSEntityDescription insertNewObjectForEntityForName:[person_entity name] inManagedObjectContext:context];

[jane setValue:[NSNumber numberWithInt:[jane hash]]  forKey:@"id"];
[jane setValue:@"Jane" forKey:@"name"];


NSManagedObject *bill = [NSEntityDescription insertNewObjectForEntityForName:[person_entity name] inManagedObjectContext:context];

[bill setValue:[NSNumber numberWithInt:[bill hash]]  forKey:@"id"];
[bill setValue:@"Bill" forKey:@"name"];


// Designate the leader for "My Company"

[organization setValue:john forKey:@"leader"];


// Designate subordinates

NSMutableSet *johns_employees = [john mutableSetValueForKey:@"employee"];
[johns_employees addObject:jane];
[johns_employees addObject:bill];


NSError *error = nil;
if(![context save:&error])
{
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
}
虽然我不打算在实际应用程序中依赖记录的顺序,但有趣的是,这个顺序似乎是随机的。人们可能会认为底层序列化例程每次都会产生相同的结果


出于好奇,为什么会发生这种情况?

这是一句有趣的话:

'有人会认为底层序列化例程每次都会产生相同的结果'

CoreData抽象了底层存储—它可以是plist、xml、sqlite等。您不能对底层例程做任何假设,您不知道它们:)它们由创建NSPersistentStore(您的NSManagedObjectContext连接到的)的人要求的存储类型决定

如果要按特定顺序返回结果,则需要为您的
NSFetchRequest
;)提供
nsderdescription


PS@bryanmac的评论对于了解sqlite可能无法以正确的顺序返回结果的原因非常有用。

不确定CoreData/sqlite的内部结构,但在许多数据库中,存储顺序由聚集索引决定。主键通常是集群索引。如果没有主键或聚集索引,则顺序可以与存储顺序相同,然后应用程序需要根据重要内容进行查询和排序。如果有聚集索引,并且查询没有orderby,它将按聚集索引的顺序返回。如果您将此作为答案发布,我将接受它。这是一个特别奇怪的假设,因为大多数SQL版本都包含一个免责声明,如“除非执行排序,否则结果返回顺序不受保证。”如果你看我的帖子,我不承认我无意相信真实应用程序中的存储顺序。这意味着,是的,我将根据需要获得NSFetchRequest订单。但这不是这篇文章的重点。我正在创建数据库,并按所示顺序将数据填充到其中。然后,我用类似SQLite数据库浏览器的东西检查数据库。几乎每次我运行代码时,记录的顺序都是不同的。在两次运行之间,我删除了“.sqlite”文件。它是创建和填充从零开始,每一次。然而,结果并不一致,这不是问题。我只是想了解为什么会发生这种情况,或者是如何发生的。那么@bryanmac对您的问题的评论就是一个很好的解释——基本上,如果您不指定,那么这是底层存储的选择——这不仅会随着不同的存储类型(如sql、xml等)而改变,甚至可能会随着不同版本的sqllite而改变。如果不知道sqlite是如何工作的(以及选择使用哪个版本的sqlite CoreData,在不同版本的iOS上可能会有所不同),你就不可能知道:)坦率地说,有更好的方法来消磨时间!