一、首先来说一下五种数据持久化方式的优缺点:
1. 属性列表 : 简单易用,但是只能适用于小数据量
2. 对象归档 : 对数据进行加密,自定义对象归档,保存的方式是序列化,只能适用于小数据量
3. NSUserDefaults :同步synchronize 应用程序内置(bundle)的一个plist文件里
4. SQLite : 基于C语言,导入libsqlite3.dylib,(开源框架FMDB/EGODataBase)
5. Core Data : 海量数据存储,面向对象的形式存储数据, 无需写SQL语句(开源框架MagicalRecord)
二、简单介绍一下属性列表、对象归档、NSUserDefaults的使用
1.属性列表 容器对象--->property list
NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/arr.plist"];
NSArray *array = @[@1, @2, @3, @4];
[array writeToFile:filePath
atomically:YES];
2.对象归档 (把数据进行序列化处理 )
NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/arr.archiver"];
NSDictionary *dic = @{@"name":@"Manning", @"age": @24};
//NSKeyedArchiver 归档对象
BOOL success = [NSKeyedArchiver archiveRootObject:dic toFile:filePath];
if (success) {
NSLog(@"成功");
}
//解归档
NSDictionary *undic = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
3.NSUserDefaults 偏好设置
NSUserDefaults支持的数据格有:
NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型
[[NSUserDefaults standardUserDefaults] setObject:@"Lucy" forKey:@"name"];
//这句话的作用为:同步,先将数据存储到应用程序内置(bundle)的一个plist文件里,
下次再从plist文件中由对应的KEY找到VALUE
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *str = [[NSUserDefaults standardUserDefaults] valueForKey:@"name"];
NSLog(@"str = %@", str);
三、浅谈CoreDate
1.CoreDate简介
CoreDate用于数据持久化,适合大数据量的存储和查询,但要注意的一点是CoreDate不是数据库,而是用来管理数据库的一套框架,CoreDate可以使用数据库、XML等方式来存储数据。可以在Xcode上进行表的设计,或使用Instruments进行性能检测,可以直接生成高质量的代码。
1.CoreDate主要对象
NSManagedObjectContext:负责应用和数据之间的交互(CRUD)
NSPersistentStoreCoordinator:(持久化存储协调器)添加持久化存储库(如SQLite数据库),是物理数据存储的物理文件和程序之间联系的桥梁, 负责管理不同对象上下文
NSManagedObjectModel:被管理的对象模型,对应定义的模型文件
NSEntityDescription:实体描述
2.数据模型
使用CoreDataA需要一个数据模型文件来描述数据模型
3.下面是打开数据库的Demo:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"沙河路径:%@",NSHomeDirectory());
[self openDataBase];
}
//1.打开数据库
- (void)openDataBase
{
//1.加载数据模型文件
NSURL *url = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
//NSManagedObjectModel:用于加载数据模型文件
NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
//2.打开模型文件对应的数据库文件
//创建协调器对象,使用协调器管理数据库文件
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
//指定数据库文件在沙河中的位置
NSString *storePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/CoreDataDemo.sqlite"];
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
//打开一个数据文件PersistentStore --> 数据库文件
/*
addPersistentStoreWithType功能:
1.如果文件不存在,创建新的数据库文件
2.如果文件存在,直接打开这个文件
*/
NSError *error = nil;
[psc addPersistentStoreWithType:NSSQLiteStoreType //生成的数据库文件格式为SQLite
configuration:nil
URL:storeURL //数据库文件保存的路径
options:nil
error:&error];
if (error) {
NSLog(@"数据库文件打开失败");
}else {
NSLog(@"数据库打开成功");
}
//3.操作数据库
context = [[NSManagedObjectContext alloc] init];
//指定contex使用哪一个Coordinator来操作数据库文件
context.persistentStoreCoordinator = psc;
}
4.常用方法:增删改查
4.1增加一条数据
- (void)addUser
{
//创建一个User实体的MO对象,把MO对象添加到Context中
User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context];
/*Context的作用
相当于MO的一个容器,MO对象添加到容器中
context通过使用coordinator来操作数据库
把MO对象和数据库文件里的数据对应
*/
user.userID = @"1001";
user.name = @"Manning";
user.age = @24;
//向context中添加一个MO对象
[context insertObject:user];
//把contex的MO对象保存到数据库里
BOOL result = [context save:nil];
if (result) {
NSLog(@"succeed");
}else
{
NSLog(@"failure");
}
4.2查询一条数据
- (void)queryUser
{
//1.创建查询请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
//2.定义要查询的条件
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 20 && name LIKE 'Lu*'"];
request.predicate = predicate;
//3.context执行查询操作
NSError *error = nil;
NSArray *array = [context executeFetchRequest:request error:&error];
for (User *user in array) {
NSLog(@"查询 : %@", user);
}
}
4.3更新一条数
- (void)updateUser
{
//1.查询出要更新的数据
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
request.predicate = [NSPredicate predicateWithFormat:@"userID = '4'"];
NSArray *result = [context executeFetchRequest:request error:nil];
// User *user = [result objectAtIndex:0];
//2.更新数据
for (User *user in result) {
user.age = @23;
}
//3.保存更新
[context save:nil];
}
4.4删除一条数据
- (void)deleteUser
{
//1.查询出要更新的数据
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
request.predicate = [NSPredicate predicateWithFormat:@"userID = '4'"];
NSArray *result = [context executeFetchRequest:request error:nil];
//2.删除数据
for (User *user in result) {
[context deleteObject:user];
}
//3.保存
[context save:nil];
}
四、浅谈SQLite数据库
1、SQL语句
2、DDL语句
3、DML语句
4、数据库操作流程
3、常用函数