2011-08-30 27 views
1

在考察从代码产生的SQLite数据库下面我发现,核心数据似乎并没有保存它们的创建顺序的对象(记录)。SQLite记录没有按照使用Core Data创建的顺序保存?

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

虽然我不打算依靠的记录的实际应用很有趣的学习顺序的顺序似乎是随机的。人们会认为底层的序列化例程每次都会产生相同的结果。

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

+0

不确定CoreData/SQLite的内部结构,但在许多数据库中的存储顺序由聚集索引确定。主键通常是集群索引。如果没有主键或聚集索引,订单可能按照存储它的顺序进行,然后应用程序需要通过重要的查询和排序。如果有一个聚集索引,并且查询没有orderby,它会按聚簇索引进行排序。 – bryanmac

+0

如果你发布这个答案,我会接受它。 –

回答

0

这是一个有趣的句子:

“人们会认为深层的串行化例程将产生相同的结果每一次”

CoreData抽象了底层存储 - 它可以是的plist ,XML,SQLite的等你不能假设有关基础例程什么,你不知道他们:)他们是由谁创建的NSPersistentStore(您的NSManagedObjectContext连接)要求的存储类型来确定。

如果你想要得到的结果早在一个特定的顺序,你需要给一个NSOrderDescriptionNSFetchRequest

PS @ bryanmac的评论是在明知是非常有用的,为什么SQLite的可能不正确的返回结果订购。

+0

这是一个非常奇怪的假设,因为大多数SQL的每一种滋味包括像免责声明“除非进行排序结果的返回顺序无法得到保证。” –

+0

如果你看看我的帖子我不否认,我有信任在实际应用中的存储顺序没有任何意图。这里的含义是,是的,我将根据需要使用NSFetchRequest命令。但这不是帖子的重点。我正在创建数据库,并按照所示顺序填充数据。然后我用像SQLite数据库浏览器这样的东西来检查数据库。几乎每次我运行代码时,记录的顺序都不相同。在运行之间,我删除了“.sqlite”文件。它是每一次创建和从头开始填充的。但是,结果并不一致。 –

+0

这不是问题。我只是想了解为什么或如何发生。 –