2011-08-30 30 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

這不是問題。我只是想了解爲什麼或如何發生。 –