iOS CoreData

CoreData实战
本文介绍如何使用CoreData进行数据持久化,包括数据模型的定义、基本的增删查改操作及查询语句的构造。

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 这个查询条件来进行过滤。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值