CoreData数据库搭建
1.首先创建父类吧重用的代码写在里边
#import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface DBCenter : NSObject @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (NSURL *) modelURL; //need to be overwrite - (NSURL *) storeURL; //need to be overwrite - (NSString *) storeDirectoryPath; - (NSString *) entityName; - (void) saveContext; @end
#import "DBCenter.h" @interface DBCenter () @end @implementation DBCenter - (NSManagedObjectModel *)managedObjectModel { // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. if (_managedObjectModel != nil) { return _managedObjectModel; } // NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"Resources" withExtension:@"bundle"]]; // NSURL *modelURL = [bundle URLForResource:@"LECPlayerDataModel" withExtension:@"momd"]; NSURL *modelURL = [self modelURL]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSURL *storeURL = [self storeURL]; NSError *error = nil; NSString *failureReason = @"There was an error creating or loading the application's saved data."; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { // Report any error we got. NSMutableDictionary *dict = [NSMutableDictionary dictionary]; dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data"; dict[NSLocalizedFailureReasonErrorKey] = failureReason; dict[NSUnderlyingErrorKey] = error; error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; // Replace this with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; } - (NSManagedObjectContext *)managedObjectContext { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (!coordinator) { return nil; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; return _managedObjectContext; } #pragma mark - - (NSURL *) modelURL { return nil; } - (NSURL *) storeURL { return nil; } - (NSString *) storeDirectoryPath { NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *dbDirectory = [documentDirectory stringByAppendingPathComponent:@"DB"]; NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:dbDirectory]) { [fileManager createDirectoryAtPath:dbDirectory withIntermediateDirectories:YES attributes:nil error:nil]; } return dbDirectory; } - (NSString *) entityName { return nil; } - (void)saveContext { NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { NSError *error = nil; if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } @end
2.然后对于某一个存储模块独立出来继承
@interface DBCenterNewsExtend : DBCenter + (DBCenterNewsExtend *) sharedNewsDBCenter; /*启动广告*/ - (LaunchingAdItemModel *) launchingAdItem; - (void) fullFillLaunchingAdItemModelWithLaunchingAdItem:(LaunchingAdItem *) launchingAdItem; - (void) saveLaunchingAdItemDataModel; - (void) removeLaunchingAdItem; /*新闻阅读记录*/ - (BOOL) hasReadWithNewsId:(NSString *) newsId; - (void) addReadRecordWithNewsId:(NSString *) newsId; /*新闻收藏记录*/ - (BOOL) hasFavoriteWithNewsId:(NSString *) newsId; - (void) addFavoriteRecordWithNewsDisplayItem:(NewsDisplayItem *) newsDisplayItem; - (void) removeFavoriteRecordWithNewsId:(NSString *) newsId; - (NSArray *) favoriteNewsList; //NSArray<NewsParamItem> /*搜索关键字列表*/ - (void) addSearchKeywordRecord:(NSString *) keyword; - (NSArray *) keywordsList; //NSArray<NewsSearchKeywordModel> - (void) cleanKeywordsList; @end
@interface DBCenterNewsExtend () @property (nonatomic, strong) LaunchingAdItemModel *launchingAdItemModel; @property (nonatomic, strong) NSMutableArray *mNewsReadRecordsList; @property (nonatomic, strong) NSMutableArray *mNewsDisplayModelList; @property (nonatomic, strong) NSMutableArray *mNewsDisplayItemList; @property (nonatomic, strong) NSMutableArray *mSearchKeywordsList; - (void) loadLaunchingAdItemModel; - (NSString *) launchingAdEntityName; - (void) loadReadRecordsList; - (NSString *) newsReadRecordEntityName; - (NewsReadRecordItemModel *) newsReadRecordItemModelWithNewsId:(NSString *) newsId; - (void) loadFavoriteRecordsList; - (NSString *) newsDisplayItemEntityName; - (NewsDisplayItem *) newsDisplayItemFromNewsDisplayDataModel:(NewsDisplayItemDataModel *) newsDisplayItemDataModel; - (NewsDisplayItemDataModel *) insertNewsDisplayItemDataModelFromNewsDisplayItem:(NewsDisplayItem *) newsDisplayItem; - (NewsDisplayItem *) newsDisplayItemWithNewsId:(NSString *) newsId; - (NewsDisplayItemDataModel *) newsDisplayItemDataModelWithNewsId:(NSString *) newsId; - (void) loadSearchKeywordsList; - (NSString *) searchKeywordEntityName; - (NewsSearchKeywordModel *) searchDataModelWithKeyword:(NSString *) keyword; @end @implementation DBCenterNewsExtend - (id) init { if (self = [super init]) { [self loadLaunchingAdItemModel]; [self loadReadRecordsList]; [self loadFavoriteRecordsList]; [self loadSearchKeywordsList]; } return self; } #pragma mark - #pragma mark Overwrite - (NSURL *) modelURL { NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"NewsModel" ofType:@"momd"]; NSURL *modelURL = [NSURL URLWithString:modelPath]; return modelURL; } - (NSURL *) storeURL { NSString *directoryPath = [self storeDirectoryPath]; NSString *storePath = [directoryPath stringByAppendingPathComponent:@"NewsModel.sqlite"]; return [NSURL fileURLWithPath:storePath]; } #pragma mark - #pragma mark Public Methods + (DBCenterNewsExtend *) sharedNewsDBCenter { static DBCenterNewsExtend *newsDBCenter = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ newsDBCenter = [[DBCenterNewsExtend alloc] init]; }); return newsDBCenter; } - (LaunchingAdItemModel *) launchingAdItem { return _launchingAdItemModel; } - (void) fullFillLaunchingAdItemModelWithLaunchingAdItem:(LaunchingAdItem *) launchingAdItem { if (!_launchingAdItemModel) { _launchingAdItemModel = [NSEntityDescription insertNewObjectForEntityForName:[self launchingAdEntityName] inManagedObjectContext:self.managedObjectContext]; [self saveContext]; } _launchingAdItemModel.adId = launchingAdItem.adId; _launchingAdItemModel.adTitle = launchingAdItem.adTitle; _launchingAdItemModel.adImgUrl = launchingAdItem.adImgUrl; _launchingAdItemModel.adWebUrl = launchingAdItem.adWebUrl; _launchingAdItemModel.adEndTime = launchingAdItem.adEndTime; [self saveContext]; } - (void) saveLaunchingAdItemDataModel { [self saveContext]; } - (void) removeLaunchingAdItem { [[self managedObjectContext] deleteObject:_launchingAdItemModel]; _launchingAdItemModel = nil; } - (BOOL) hasReadWithNewsId:(NSString *) newsId { bool hasRead = NO; if ([self newsReadRecordItemModelWithNewsId:newsId]) { hasRead = YES; } return hasRead; } - (void) addReadRecordWithNewsId:(NSString *) newsId { if (![self newsReadRecordItemModelWithNewsId:newsId]) { NewsReadRecordItemModel *newsReadRecordItemModel = [NSEntityDescription insertNewObjectForEntityForName:[self newsReadRecordEntityName] inManagedObjectContext:self.managedObjectContext]; newsReadRecordItemModel.newsId = newsId; [_mNewsReadRecordsList addObject:newsReadRecordItemModel]; [self saveContext]; } } /*新闻收藏记录*/ - (BOOL) hasFavoriteWithNewsId:(NSString *) newsId { for (NewsDisplayItem *newsDisplayItem in _mNewsDisplayItemList) { if (newsDisplayItem.newsDisplayParamItemList.count > 0) { NewsDisplayParamItem *displayParamItem = newsDisplayItem.newsDisplayParamItemList[0]; if ([displayParamItem.newsId isEqualToString:newsId]) { return YES; } } } return NO; } - (void) addFavoriteRecordWithNewsDisplayItem:(NewsDisplayItem *) newsDisplayItem { NewsDisplayParamItem *newsDisplayParamItem; if (newsDisplayItem.newsDisplayParamItemList.count > 0) { newsDisplayParamItem = newsDisplayItem.newsDisplayParamItemList[0]; } NSString *newsId = newsDisplayParamItem.newsId; if (![self hasFavoriteWithNewsId:newsId]) { [self insertNewsDisplayItemDataModelFromNewsDisplayItem:newsDisplayItem]; } } - (void) removeFavoriteRecordWithNewsId:(NSString *) newsId { NewsDisplayItemDataModel *newsDisplayItemDataModel = [self newsDisplayItemDataModelWithNewsId:newsId]; if (newsDisplayItemDataModel) { [[self managedObjectContext] deleteObject:newsDisplayItemDataModel]; [self saveContext]; } NewsDisplayItem *newsDisplayItem = [self newsDisplayItemWithNewsId:newsId]; if (newsDisplayItem) { [_mNewsDisplayItemList removeObject:newsDisplayItem]; } } - (NSArray *) favoriteNewsList { return _mNewsDisplayItemList; } /*搜索关键字列表*/ - (void) addSearchKeywordRecord:(NSString *) keyword { if (![self searchDataModelWithKeyword:keyword]) { NewsSearchKeywordModel *newsSearchKeywordModel = [NSEntityDescription insertNewObjectForEntityForName:[self searchKeywordEntityName] inManagedObjectContext:self.managedObjectContext]; newsSearchKeywordModel.keyword = keyword; [_mSearchKeywordsList addObject:newsSearchKeywordModel]; [self saveContext]; } } - (NSArray *) keywordsList { NSMutableArray *mKeywordList = [[NSMutableArray alloc] init]; for (NewsSearchKeywordModel *keywordModel in _mSearchKeywordsList) { [mKeywordList addObject:keywordModel.keyword]; } return mKeywordList; } - (void) cleanKeywordsList { for (NewsSearchKeywordModel *searchKeywordModel in _mSearchKeywordsList) { [[self managedObjectContext] deleteObject:searchKeywordModel]; } [_mSearchKeywordsList removeAllObjects]; [self saveContext]; } #pragma mark - #pragma mark Public Methods - (void) loadLaunchingAdItemModel { NSFetchRequest* request=[[NSFetchRequest alloc] init]; NSEntityDescription* userItemDataModelDescription = [NSEntityDescription entityForName:[self launchingAdEntityName] inManagedObjectContext:self.managedObjectContext]; [request setEntity:userItemDataModelDescription]; NSArray* fetchResultList = [self.managedObjectContext executeFetchRequest:request error:nil]; if (fetchResultList.count > 0) { _launchingAdItemModel = fetchResultList[0]; } } - (NSString *) launchingAdEntityName { return @"LaunchingAdItemModel"; } - (void) loadReadRecordsList { NSFetchRequest* request=[[NSFetchRequest alloc] init]; NSEntityDescription* userItemDataModelDescription = [NSEntityDescription entityForName:[self newsReadRecordEntityName] inManagedObjectContext:self.managedObjectContext]; [request setEntity:userItemDataModelDescription]; NSArray* fetchResultList = [self.managedObjectContext executeFetchRequest:request error:nil]; _mNewsReadRecordsList = [NSMutableArray arrayWithArray:fetchResultList]; } - (NSString *) newsReadRecordEntityName { return @"NewsReadRecordItemModel"; } - (NewsReadRecordItemModel *) newsReadRecordItemModelWithNewsId:(NSString *) newsId { for (NewsReadRecordItemModel *newsReadRecordItemModel in _mNewsReadRecordsList) { if ([newsReadRecordItemModel.newsId isEqualToString:newsId]) { return newsReadRecordItemModel; } } return nil; } - (void) loadFavoriteRecordsList { _mNewsDisplayModelList = [[NSMutableArray alloc] init]; _mNewsDisplayItemList = [[NSMutableArray alloc] init]; NSFetchRequest* request=[[NSFetchRequest alloc] init]; NSEntityDescription* userItemDataModelDescription = [NSEntityDescription entityForName:[self newsDisplayItemEntityName] inManagedObjectContext:self.managedObjectContext]; [request setEntity:userItemDataModelDescription]; NSArray* fetchResultList = [self.managedObjectContext executeFetchRequest:request error:nil]; _mNewsDisplayModelList = [NSMutableArray arrayWithArray:fetchResultList]; for (NewsDisplayItemDataModel *newsDisplayItemDataModel in _mNewsDisplayModelList) { NewsDisplayItem *newsDisplayItem = [self newsDisplayItemFromNewsDisplayDataModel:newsDisplayItemDataModel]; [_mNewsDisplayItemList addObject:newsDisplayItem]; } } - (NSString *) newsDisplayItemEntityName { return @"NewsDisplayItemDataModel"; } - (NewsDisplayItem *) newsDisplayItemFromNewsDisplayDataModel:(NewsDisplayItemDataModel *) newsDisplayItemDataModel { NewsDisplayItem *newsDisplayItem = [[NewsDisplayItem alloc] init]; newsDisplayItem.displayType = [newsDisplayItemDataModel.displayType integerValue]; newsDisplayItem.subscriptType = [newsDisplayItemDataModel.subscriptType integerValue]; NewsDisplayParamItem *newsDisplayParamItem = [[NewsDisplayParamItem alloc] init]; newsDisplayParamItem.newsId = newsDisplayItemDataModel.newsId; newsDisplayParamItem.newsTitle = newsDisplayItemDataModel.newsTitle; newsDisplayParamItem.newsBrief = newsDisplayItemDataModel.newsBrief; newsDisplayParamItem.newsDetailType = [newsDisplayItemDataModel.newsDetailType integerValue]; newsDisplayParamItem.imagesList = [newsDisplayItemDataModel.newsImageList componentsSeparatedByString:@" "]; newsDisplayItem.newsDisplayParamItemList = @[newsDisplayParamItem]; return newsDisplayItem; } - (NewsDisplayItemDataModel *) insertNewsDisplayItemDataModelFromNewsDisplayItem:(NewsDisplayItem *) newsDisplayItem { NewsDisplayItemDataModel *newsDisplayItemDataModel = [NSEntityDescription insertNewObjectForEntityForName:[self newsDisplayItemEntityName] inManagedObjectContext:self.managedObjectContext]; newsDisplayItemDataModel.displayType = @(newsDisplayItem.displayType); newsDisplayItemDataModel.subscriptType = @(newsDisplayItem.subscriptType); if (newsDisplayItem.newsDisplayParamItemList.count > 0) { NewsDisplayParamItem *newsDisplayParamItem = newsDisplayItem.newsDisplayParamItemList[0]; newsDisplayItemDataModel.newsId = newsDisplayParamItem.newsId; newsDisplayItemDataModel.newsBrief = newsDisplayParamItem.newsBrief; newsDisplayItemDataModel.newsDetailType = @(newsDisplayParamItem.newsDetailType); newsDisplayItemDataModel.newsTitle = newsDisplayParamItem.newsTitle; NSMutableString *newsImageListString = [[NSMutableString alloc] init]; for (int i = 0; i < newsDisplayParamItem.imagesList.count; i++) { NSString *imageUrl = newsDisplayParamItem.imagesList[i]; [newsImageListString appendString:imageUrl]; if (i < newsDisplayParamItem.imagesList.count - 1) { [newsImageListString appendString:@" "]; } } newsDisplayItemDataModel.newsImageList = newsImageListString; } [_mNewsDisplayModelList addObject:newsDisplayItemDataModel]; [_mNewsDisplayItemList addObject:newsDisplayItem]; [self saveContext]; return newsDisplayItemDataModel; } - (NewsDisplayItem *) newsDisplayItemWithNewsId:(NSString *) newsId { for (NewsDisplayItem *newsDisplayItem in _mNewsDisplayItemList) { if (newsDisplayItem.newsDisplayParamItemList.count > 0) { NewsDisplayParamItem *displayParamItem = newsDisplayItem.newsDisplayParamItemList[0]; if ([displayParamItem.newsId isEqualToString:newsId]) { return newsDisplayItem; } } } return nil; } - (NewsDisplayItemDataModel *) newsDisplayItemDataModelWithNewsId:(NSString *) newsId { for (NewsDisplayItemDataModel *newsDisplayItemDataModel in _mNewsDisplayModelList) { if ([newsDisplayItemDataModel.newsId isEqualToString:newsId]) { return newsDisplayItemDataModel; } } return nil; } - (void) loadSearchKeywordsList { NSFetchRequest* request=[[NSFetchRequest alloc] init]; NSEntityDescription* keywordModelDescription = [NSEntityDescription entityForName:[self searchKeywordEntityName] inManagedObjectContext:self.managedObjectContext]; [request setEntity:keywordModelDescription]; NSArray* fetchResultList = [self.managedObjectContext executeFetchRequest:request error:nil]; _mSearchKeywordsList = [NSMutableArray arrayWithArray:fetchResultList]; } - (NSString *) searchKeywordEntityName { return @"NewsSearchKeywordModel"; } - (NewsSearchKeywordModel *) searchDataModelWithKeyword:(NSString *) keyword { for (NewsSearchKeywordModel *newsSearchKeywordModel in _mSearchKeywordsList) { if ([newsSearchKeywordModel.keyword isEqualToString:keyword]) { return newsSearchKeywordModel; } } return nil; } @end