1.coreData 的初始化
导入CoreData.framework 的框架
创建新文件:CoreData --->Data Model 、 NSManagedObject subclass 两个文件 等
在新建的.xcdatamodeld 文件中添加所需要实体对象。可以参考其他初始化的文档。
2. coreData 代码
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "UserInfo.h"
#define TABLENAME @"UserInfoEntity"
@interface CustomCoreDataManagement : NSObject
@property (nonatomic,strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic,strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic,strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+ (CustomCoreDataManagement *)defaultManagment;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
- (BOOL)insertCoreData:(UserInfo *)userInfoData ;
- (NSMutableArray *)searchDataSelectUserName:(NSString *)userName;
- (NSMutableArray *)searchDataSelectUserTel:(NSString *)userTel;
- (BOOL)deleteData:(NSString *)userId;
- (BOOL)updateData:(UserInfo *)_userInfoDict UserInfoId:(NSString *)userId;
- (NSMutableArray *)readAllUserInfo;
- (BOOL)clearUserInfoTable;
@end
//
// CustomCoreDataManagement.m
// DataSaveDemo
//
// Created by wing on 14/11/27.
// Copyright (c) 2014年 xxxxx. All rights reserved.
//
#import "CustomCoreDataManagement.h"
#import "UserInfoEntity.h"
#import "UserInfo.h"
@implementation CustomCoreDataManagement
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
static CustomCoreDataManagement *coreDataManagement = nil;
+(CustomCoreDataManagement *)defaultManagment {
@synchronized(self){
if (coreDataManagement == nil) {
coreDataManagement = [[CustomCoreDataManagement alloc] init];
}
}
return coreDataManagement;
}
- (void)saveContext {
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@" %@ %@",error,[error userInfo]);
abort();
}
}
}
- (NSManagedObjectContext *)managedObjectContext{
if (_managedObjectContext) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel) {
return _managedObjectModel;
}
NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"CustomCoreDataModel" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CustomCoreDataModel.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"unresolved error %@ %@",error,[error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (BOOL)insertCoreData:(UserInfo *)_userInfoData {
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *userInfo = [NSEntityDescription insertNewObjectForEntityForName:TABLENAME inManagedObjectContext:context];
[userInfo setValue:(_userInfoData.userName ? _userInfoData.userName : @" ") forKey:@"userName"];
[userInfo setValue:(_userInfoData.userTel ? _userInfoData.userTel : @" ") forKey:@"userTel"];
[userInfo setValue:(_userInfoData.userSex ? _userInfoData.userSex : @" ") forKey:@"userSex"];
[userInfo setValue:(_userInfoData.userAge ? _userInfoData.userAge : @" ") forKey:@"userAge"];
[userInfo setValue:(_userInfoData.userAddress ? _userInfoData.userAddress : @" ") forKey:@"userAddress"];
[userInfo setValue:(_userInfoData.userRemark ? _userInfoData.userRemark : @" ") forKey:@"userRemark"];
[userInfo setValue:(_userInfoData.userId ? _userInfoData.userId : @" ") forKey:@"userId"];
NSError *error ;
if (![ context save:&error]) {
NSLog(@" 不能保存 %@ ",[error localizedDescription]);
return NO;
}
return YES;
}
- (NSMutableArray *)searchDataSelectUserName:(NSString *)userName {
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:TABLENAME];
request.predicate = [NSPredicate predicateWithFormat:@"userName CONTAINS[cd] %@",userName];
NSError *error = nil;
NSArray *dataResult = [self.managedObjectContext executeFetchRequest:request error:&error];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
for (NSManagedObject *info in dataResult) {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[info valueForKey:@"userName"] forKey:@"userName"];
[dict setObject:[info valueForKey:@"userTel"] forKey:@"userTel"];
[dict setObject:[info valueForKey:@"userSex"] forKey:@"userSex"];
[dict setObject:[info valueForKey:@"userAge"] forKey:@"userAge"];
[dict setObject:[info valueForKey:@"userAddress"] forKey:@"userAddress"];
[dict setObject:[info valueForKey:@"userRemark"] forKey:@"userRemark"];
[dict setObject:[info valueForKey:@"userId"] forKey:@"userId"];
[resultArray addObject:dict];
[dict release];
dict = nil;
}
return resultArray;
}
- (NSMutableArray *)searchDataSelectUserTel:(NSString *)userTel {
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:TABLENAME];
request.predicate = [NSPredicate predicateWithFormat:@"userTel CONTAINS[cd] %@",userTel];
NSError *error = nil;
NSArray *dataResult = [self.managedObjectContext executeFetchRequest:request error:&error];
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
for (NSManagedObject *info in dataResult) {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:[info valueForKey:@"userName"] forKey:@"userName"];
[dict setObject:[info valueForKey:@"userTel"] forKey:@"userTel"];
[dict setObject:[info valueForKey:@"userSex"] forKey:@"userSex"];
[dict setObject:[info valueForKey:@"userAge"] forKey:@"userAge"];
[dict setObject:[info valueForKey:@"userAddress"] forKey:@"userAddress"];
[dict setObject:[info valueForKey:@"userRemark"] forKey:@"userRemark"];
[dict setObject:[info valueForKey:@"userId"] forKey:@"userId"];
[resultArray addObject:dict];
[dict release];
dict = nil;
}
return resultArray;
}
- (BOOL)deleteData:(NSString *)userId {
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:TABLENAME];
request.predicate = [NSPredicate predicateWithFormat:@"userId=%@",userId];
NSError *error = nil;
NSArray *dataResult = [self.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@" dataResult: %@ %@ ",dataResult,userId);
NSArray *datas = [self.managedObjectContext executeFetchRequest:request error:&error];
for (NSManagedObject *obj in datas){
[self.managedObjectContext deleteObject:obj];
}
if (![self.managedObjectContext save:&error]){
NSLog(@"clear Table error:%@",error);
return NO;
}
return YES;
}
- (BOOL)updateData:(UserInfo *)_userInfoDict UserInfoId:(NSString *)userId {
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:TABLENAME];
request.predicate = [NSPredicate predicateWithFormat:@"userId=%@",userId];
NSError *error = nil;
NSArray *dataResult = [self.managedObjectContext executeFetchRequest:request error:&error];
if ([dataResult count]<=0) {
return NO;
}
//更新
for (UserInfo *userInfo in dataResult) {
userInfo.userName = _userInfoDict.userName;
userInfo.userTel = _userInfoDict.userTel;
userInfo.userSex = _userInfoDict.userSex;
userInfo.userAge = _userInfoDict.userAge;
userInfo.userAddress = _userInfoDict.userAddress;
userInfo.userRemark = _userInfoDict.userRemark;
userInfo.userId = _userInfoDict.userId;
}
//保存
if ([self.managedObjectContext save:&error]) {
NSLog(@"更新成功");
return YES;
}
return NO;
}
- (NSArray *)readAllUserInfo {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:TABLENAME inManagedObjectContext:self.managedObjectContext]];
NSError *error = NULL;
NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@" Error: %@",[error localizedDescription]);
return nil;
}
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
for (NSManagedObject *info in array) {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:([info valueForKey:@"userName"] ? [info valueForKey:@"userName"] : @" " ) forKey:@"userName"];
[dict setObject:([info valueForKey:@"userTel"] ? [info valueForKey:@"userTel"] : @" " ) forKey:@"userTel"];
[dict setObject:([info valueForKey:@"userSex"] ? [info valueForKey:@"userSex"] : @" " ) forKey:@"userSex"];
[dict setObject:([info valueForKey:@"userAge"] ? [info valueForKey:@"userAge"] : @" " ) forKey:@"userAge"];
[dict setObject:([info valueForKey:@"userAddress"] ? [info valueForKey:@"userAddress"] : @" " ) forKey:@"userAddress"];
[dict setObject:([info valueForKey:@"userRemark"] ? [info valueForKey:@"userRemark"] : @" " ) forKey:@"userRemark"];
[dict setObject:([info valueForKey:@"userId"] ? [info valueForKey:@"userId"] : @" " ) forKey:@"userId"];
[resultArray addObject:dict];
[dict release];
dict = nil;
}
return resultArray;
}
- (BOOL)clearUserInfoTable {
NSEntityDescription *description = [NSEntityDescription entityForName:TABLENAME inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setIncludesPropertyValues:NO];
[request setEntity:description];
NSError *error = nil;
NSArray *datas = [self.managedObjectContext executeFetchRequest:request error:&error];
if (!error && datas && [datas count]){
for (NSManagedObject *obj in datas){
[self.managedObjectContext deleteObject:obj];
}
if (![self.managedObjectContext save:&error]){
NSLog(@"clear Table error:%@",error);
return NO;
}else {
return YES;
}
}
return YES;
}
@end
备注:
表格结构 --> NSEntityDescription
数据库中所有表格和他们的联系 -->NSManagedObjectModel
数据库存放方式 --> NSPersistentStoreCoordinator
数据库操作 --> NSManagedObjectContext
查询语句 --> NSFetchRequest
表格的记录 --> NSManagedObject
@dynamic和@synthesize有什么区别呢 ?
在声明 property属性后,有2种实现选择
@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由 Core Data框架在程序运行的时动态生成子类属性
1.比较运算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"
2.范围运算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF
例:@"SELF == 'APPLE'"
4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAINS[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。
5.通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
6.正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
多表查询主要就在于表之间建立好相关的关联关系(relationship),其次就是充分的使用NSPredicate 这个查询条件来进行过滤。