托管对象必须是NSManagedObject或者NSManagedObject子类的任一实例。NSManagedObject能够表述任何实体。它使用一个私有的内部存储,以维护其属性,并实现托管对象所需的所有基本行为。托管对象有一个指向实体描述的引用。实体描述表述了实体的元数据,包括实体的名称,实体的属性和实体之间的关系。可以创建NSManagedObject子类来实现实体的其他行为。
7.1.3. 基本实现
1、指定存储数据文件
OBJC
1234 | *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); *documentsDirectory = [paths lastObject]; *persistentStorePath = [[documentsDirectory stringByAppendingPathComponent:@"TopSongs.sqlite"] retain]; |
2、创建托管对象模型
OBJC
1 | *managedObjectModel = [[ mergedModelFromBundles:nil] retain]; |
3、创建持久化存储协调器,并使用SQLite数据库做持久化存储
OBJC
1234 | *storeUrl = [ fileURLWithPath:self.persistentStorePath]; *persistentStoreCoordinator = [[ alloc] initWithManagedObjectModel:self.managedObjectModel]; *error = nil; *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]; |
4、创建托管对象上下文
OBJC
12 | *managedObjectContext = [[ alloc] init];[managedObjectContext setPersistentStoreCoordinator: self.persistentStoreCoordinator]; |
5、创建实体描述对象
OBJC
1 | *entityDescription = [[ entityForName:@"Song" inManagedObjectContext: self.managedObjectContext] retain]; |
6、创建托管对象
OBJC
1 | *managedObject = [[ alloc] initWithEntity:self.entityDescription insertIntoManagedObjectContext:self.managedObjectContext]; |
7、保存
OBJC
12 | *saveError = nil;[self.managedObjectContext save:&saveError] |
8、创建获取数据请求
OBJC
12345 | *fetchRequest = [[ alloc] init];// 数据排序,Sort key为NSManagedObject托管对象的一个属性 *sortDescriptor = [[ alloc] initWithKey:@"" ascending:YES]; *sortDescriptors = [[ alloc] initWithObjects:sortDescriptor, nil];[fetchRequest setSortDescriptors:sortDescriptors]; |
9、获取持久化存储中的数据,并对数据进行缓存
OBJC
12345678 | NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@""]; *error;BOOL success = [self.fetchedResultsController performFetch:&error]; |