coreData數據庫簡單項目案列
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong)NSManagedObjectContext *context;
@property (nonatomic,strong)NSMutableArray *dataSoure;
@property (nonatomic,strong)UITableView *tablew;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)];
[self prepareForCoreData];
[self initTableView];
}
- (void)initTableView{
self.tablew = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tablew.delegate = self;
self.tablew.dataSource = self;
[self.view addSubview:self.tablew];
}
- (void)addAction{
[self showAlertWithFriend:nil];
}
- (void)saveAction:(UIAlertController *) alert{
UITextField *usernameText = alert.textFields.firstObject;
UITextField *personIdText = alert.textFields.lastObject;
NSString *username= usernameText.text;
NSNumber *personId = @(personIdText.text.integerValue);
Person * person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
person.name = username;
person.personID = personId;
[self.context save:nil];
[self.dataSoure addObject:person];
[self.tablew reloadData];
}
#pragma mark ---協議方法----
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataSoure.count;
}
- (UITableViewCell * )tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *reuseid = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseid];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseid];
}
// 展示
Person *p = self.dataSoure[indexPath.row];
cell.textLabel.text = p.name;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", p.personID];
return cell;
}
#pragma mark ---數據庫協議----
- (void)prepareForCoreData{
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// 找地址
// .xcdatamodeld 文件, 編譯后, 會生成 .momd 這樣的文件
// 所以, 我們找 .momd 類型即可
NSString *path = [[NSBundle mainBundle] pathForResource:@"CoreDataProject" ofType:@"momd"];
// 實例化數據存儲模型
// 在這里, 需要傳入 xcdatamodeld 文件的地址
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];
// 實例化數據持久存儲協調器
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
// 設置數據庫文件保存的路徑
// ~/
NSString *storePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/xiaoqiang.db"];
// 設置存儲類型
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:storePath] options:nil error:nil];
[self.context setPersistentStoreCoordinator:coordinator];
}
#pragma mark ---選中回調---
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// [self showAlertWithFriend:nil];
//改彈窗
[self showAlertWithFriend:self.dataSoure[indexPath.row]];
}
#pragma mark ---彈窗展示
- (void)showAlertWithFriend:(Person *)person{
// [self a]
NSLog(@"進來了");
//如果模型存在,表示修改操作
//如果模型不存在,表示增的操作
UIAlertController *altert = [UIAlertController alertControllerWithTitle:@"提示" message:@"請輸入用戶信息" preferredStyle:UIAlertControllerStyleAlert];
//添加輸入框
[altert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
// 這里寫輸入框的配置屬性
textField.placeholder =@"請輸入姓名";
//輸入框文本 可以編輯
textField.font = [UIFont systemFontOfSize:13];
textField.text = person.name;
}];
[altert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
// 這里寫輸入框的配置屬性
textField.placeholder =@"請輸入手機號碼";
//輸入框文本 可以編輯
textField.font = [UIFont systemFontOfSize:13];
NSString *str = [NSString stringWithFormat:@"%@",person.personID];
textField.text = str;
//
// textField.keyboardType = UIKeyboardTypeNumberPad;
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *done = [UIAlertAction actionWithTitle:@"保存" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
// [self addAction:altert];
// 區分不同的情況, 分別調用
// person如果存在, 表示是改的操作
// person如果不存在, 表示是增的操作
if (person) {
[self updateAction:altert person:person];
}
else{
[self saveAction:altert];
}
}];
[altert addAction:cancel];
[altert addAction:done];
[self presentViewController:altert animated:YES completion:nil];
}
- (void)updateAction:(UIAlertController *)altert person:(Person *)person{
//2.本地修改
//需要一個新的模型來存儲新的內容
UITextField *usernameText = altert.textFields.firstObject;
UITextField *phoneText = altert.textFields.lastObject;
// Person *newPerson = [[Person alloc] init];
person.name = usernameText.text;
// newPerson.name = usernameText.text;
// ;
person.personID = [NSNumber numberWithFloat:[phoneText.text floatValue]];
// newPerson.personID = [NSNumber numberWithFloat:[phoneText.text floatValue]];
/**修改界面顯示*/
//找出一個元素在數組中的下標
NSInteger index = [self.dataSoure indexOfObject:person];
[self.dataSoure replaceObjectAtIndex:index withObject:person];
//刷新表格
[self.tablew reloadData];
// NSInteger indexTWo = [[self findAll] indexOfObject:person];
// Person *persont = [self findAll][indexTWo];
// persont.name = usernameText.text;
// persont.personID = [NSNumber numberWithFloat:[phoneText.text floatValue]];
[self.context save:nil];
}
#pragma mark ---滑動刪除---
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// 獲取這一行顯示的數據
Person *p = self.dataSoure[indexPath.row];
// 1. 從界面顯示刪除
[self.dataSoure removeObject:p];
[self.tablew reloadData];
// 2. 從本地緩存中刪除
[self.context deleteObject:p];
[self.context save:nil];
}
- (NSArray *)findAll{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
return [self.context executeFetchRequest:request error:nil];
}
#pragma mark ----懶加載---
- (NSMutableArray *)dataSoure{
if (_dataSoure == nil) {
_dataSoure = [[NSMutableArray alloc] init];
[_dataSoure addObjectsFromArray:[self findAll]];
}
return _dataSoure;
}
@end
Person類
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Person : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * personID;
@end
#import "Person.h"
@implementation Person
@dynamic name;
@dynamic personID;
@end