CoreData
今天闲来没事看了看CoreData,终于知道为什么大家更倾向于第三方库了,CoreData使用起来还是 挺麻烦的。
深层次的东西还没有深究,例如多线程、线程安全一类的,本次只是简单地了解了下CoreData的使用。
最重要的就是NSManagedObjectContext(上下文),我们对数据库的操作都是通过这个对象进行的。
1.首先需要加载实体模型文件,得到模型(编译后的后缀momd)
NSString*path = [[NSBundlemainBundle]pathForResource:@"CoreData"ofType:@"momd"];
NSManagedObjectModel*model = [[NSManagedObjectModelalloc]initWithContentsOfURL:[NSURLfileURLWithPath:path]];
2.建立数据库
NSString*homePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
NSString*dbPath = [homePathstringByAppendingString:@"/myCoreData.db"];
3.持久化存储协调器(连接数据库)
NSPersistentStoreCoordinator*coordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:model];
NSError*error =nil;
NSPersistentStore*store = [coordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:dbPath]options:nilerror:&error];
4.创建上下文对象,操作数据库(设置上下文对象的协调器)
_context= [[NSManagedObjectContextalloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_context.persistentStoreCoordinator= coordinator;
下面一个小demo
#import"ViewController.h"
#import"Person.h"
@interfaceViewController()<UITableViewDataSource,UITableViewDelegate>
@property(strong,nonatomic)IBOutletUITextField*nameField;
@property(strong,nonatomic)IBOutletUITextField*ageField;
@property(strong,nonatomic)IBOutletUITableView*tableView;
- (IBAction)addObject:(UIButton*)sender;
- (IBAction)delObject:(UIButton*)sender;
- (IBAction)updateObject:(UIButton*)sender;
- (IBAction)searchObject:(UIButton*)sender;
@end
staticNSString*identifier =@"cell";
@implementationViewController
{
NSManagedObjectContext*_context;
NSMutableArray*_dataArray;
NSInteger_selectedRow;
}
- (void)viewDidLoad
{
[superviewDidLoad];
[selfreadyCoreData];
[selfcreateUI];
}
- (void)readyCoreData
{
NSString*path = [[NSBundlemainBundle]pathForResource:@"CoreData"ofType:@"momd"];
NSManagedObjectModel*model = [[NSManagedObjectModelalloc]initWithContentsOfURL: [NSURLfileURLWithPath:path]];
NSString*homePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
NSString*dbPath = [homePathstringByAppendingString:@"/myCoreData.db"];
NSLog(@"%@",dbPath);
NSPersistentStoreCoordinator*coordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:model];
NSError*error =nil;
NSPersistentStore*store = [coordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:dbPath]options:nilerror:&error];
if(store ==nil)
{
NSLog(@"%@",error.localizedDescription);
}
_context= [[NSManagedObjectContextalloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_context.persistentStoreCoordinator= coordinator;
Person*person1 = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Person"inManagedObjectContext:_context];
person1.age= [NSNumbernumberWithInt:23];
person1.name=@"liming";
Person*person2 = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Person"inManagedObjectContext:_context];
person2.name=@"wangqiang";
person2.age= [NSNumbernumberWithInt:30];
Person*person3 = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Person"inManagedObjectContext:_context];
person3.name=@"lisi";
person3.age= [NSNumbernumberWithInt:18];
[_contextsave:&error];
NSFetchRequest*request = [[NSFetchRequestalloc]initWithEntityName:@"Person"];
NSArray*array = [_contextexecuteFetchRequest:requesterror:nil];
_dataArray= [arraymutableCopy];
}
- (void)createUI
{
[self.tableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:identifier];
}
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return_dataArray.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:identifier];
if(cell ==nil)
{
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
Person*person = [_dataArrayobjectAtIndex:indexPath.row];
cell.textLabel.text= [NSStringstringWithFormat:@"姓名:%@年龄:%@",person.name,person.age];
returncell;
}
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
_selectedRow= indexPath.row;
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
}
- (IBAction)addObject:(UIButton*)sender {
if(self.nameField.text.length<=0||self.ageField.text.length<=0)
{
return;
}
Person*person = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Person"inManagedObjectContext:_context];
person.name=self.nameField.text;
person.age= [NSNumbernumberWithInt:[self.ageField.textintValue]];
NSError*error =nil;
[_contextsave:&error];
[_dataArrayaddObject:person];
[self.tableViewreloadData];
}
- (IBAction)delObject:(UIButton*)sender
{
if(_selectedRow>=0&&_selectedRow<=_dataArray.count-1)
{
Person*person = [_dataArrayobjectAtIndex:_selectedRow];
[_contextdeleteObject:person];
BOOLret = [_contextsave:nil];
if(ret)
{
NSLog(@"删除成功");
[_dataArrayremoveObjectAtIndex:_selectedRow];
[self.tableViewreloadData];
}
else
{
NSLog(@"删除失败");
}
}
}
- (IBAction)updateObject:(UIButton*)sender {
NSFetchRequest*request = [[NSFetchRequestalloc]initWithEntityName:@"Person"];
NSPredicate*predicate = [[NSPredicatealloc]init];
predicate = [NSPredicatepredicateWithFormat:@"name='liming'"];
request.predicate= predicate;
NSArray*array = [_contextexecuteFetchRequest:requesterror:nil];
for(Person*personinarray)
{
person.name=@"lily";
person.age= [NSNumbernumberWithInt:15];
}
[_contextsave:nil];
NSFetchRequest*allRequest = [[NSFetchRequestalloc]initWithEntityName:@"Person"];
NSArray*allArray = [_contextexecuteFetchRequest:allRequesterror:nil];
_dataArray= [allArraymutableCopy];
[self.tableViewreloadData];
}
- (IBAction)searchObject:(UIButton*)sender {
NSFetchRequest*request = [[NSFetchRequestalloc]initWithEntityName:@"Person"];
NSPredicate*predicate = [[NSPredicatealloc]init];
NSString*txt_name =nil;
NSNumber*txt_age =nil;
if(self.nameField.text.length>0&&self.ageField.text.length>0)
{
txt_name =self.nameField.text;
txt_age = [NSNumbernumberWithInt:[self.ageField.textintValue]];
predicate = [NSPredicatepredicateWithFormat:@"name=%@ AND age=%@",txt_name,txt_age];
request.predicate= predicate;
NSArray*array = [_contextexecuteFetchRequest:requesterror:nil];
if(array.count==0)
{
NSLog(@"没有相关数据");
}
else
{
for(Person*personinarray)
{
NSLog(@"%@-%@",person.name,person.age);
}
}
}
elseif(self.nameField.text.length>0&&self.ageField.text.length==0)
{
txt_name =self.nameField.text;
predicate = [NSPredicatepredicateWithFormat:@"name=%@",txt_name];
request.predicate= predicate;
NSArray*array = [_contextexecuteFetchRequest:requesterror:nil];
if(array.count==0)
{
NSLog(@"没有相关数据");
}
else
{
for(Person*personinarray)
{
NSLog(@"%@-%@",person.name,person.age);
}
}
}
elseif(self.nameField.text.length==0&&self.ageField.text.length>0)
{
txt_age = [NSNumbernumberWithInt:[self.ageField.textintValue]];
predicate = [NSPredicatepredicateWithFormat:@"age=%@",txt_age];
request.predicate= predicate;
NSArray*array = [_contextexecuteFetchRequest:requesterror:nil];
if(array.count==0)
{
NSLog(@"没有相关数据");
}
else
{
for(Person*personinarray)
{
NSLog(@"%@-%@",person.name,person.age);
}
}
}
else
{
NSLog(@"请输入查询条件");
}
}
@end
实体对象Person类(需继承NSManagedObject)
#import
@interfacePerson :NSManagedObject
@property(nonatomic,strong)NSString*name;
@property(nonatomic,strong)NSNumber*age;
@end
#import"Person.h"
@implementationPerson
@synthesizeage;
@synthesizename;
@end