++ 数据存储++
ios中常用的持久化数据的方法:
1、属性列表:Xcode的Property List;再序列化到文件中,使用NSString、NSArray或NSDirectory等的writeToFile方法;主要用于解决硬编码问题;
2、对象归档:
3、SQLite3:
4、Core Data:是一种ORM技术;本质上是通过sqlite或二进制文件、内存形式来存储;
[另外还包括C语言的I/O调用;Cocoa的底层文件管理工具。]
对象归档
Applications目录:
Documents:应用数据存储在Documents中,但基于NSUserDefaults的首先项除外;
Library:基于NSUserDefaults的首选项设置存储在Library/Preferences文件夹中;
tmp:供应用存储临时文件。
//返回Documents的路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"Document path is %@",paths[0]);
//获取temp的路径
NSString *temPath = NSTemporaryDirectory();
NSLog(@"temp path is %@",temPath);
归档(archiving):是指另一种形式的序列化,是任何对象都可以实现的更常规的类型。必须遵循NSCoding协议(类似java中的Serializable);
同NSCopying
//实现NSCoding的方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
_age = [aDecoder decodeIntegerForKey:kAgeKey];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInteger:_age forKey:kAgeKey];
}
存档归档操作:
//归档存储
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//存入数据
[archiver encodeObject:myObj forKey:@"keyString"];
//进行提交
[archiver finishEncoding];
//写入到文件系统
BOOL success = [data writeToFile:path atomically:YES];
/*******从存档中读取数据重组对象***********/
NSData *readData = [[NSData alloc] initWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:readData];
//读取数据
obj = [unarchiver decodeObjectForKey:@"keyString"];
//告知归档程序完成
[unarchiver finishDecoding];
+SQLite3+
ios已提供了ORM(对象关系映射)的解决方案:Core Data;
导入头文件#import <sqlite3.h>
SQlite3是采用可移植的C(非Object-C)编写的,因此字符串不用加@;对于NSString 使用 [str UTF8String]转换面C下的String;
须先导入sqlite3的相关库:
选中项目—> TARGETS下的项目名—->Build Phases—>Link Binary with Libraries —> 点击+,在弹出的面板中搜索sqlite3,并add
相关操作:
sqlite3 *database;
int result = sqlite3_open("/path/to/database", &database);
if (result == SQLITE_OK) {
//数据库打开成功
char *errorMsg;
const char *createSQL = "create table if not exists Student(ID INTEGER PRIMARY KEY AUTOINCREMENT,msg TEXT)";
int excResult = sqlite3_exec(database, createSQL, NULL, NULL, &errorMsg);
if (excResult == SQLITE_OK) {
//执行sql成功
}else{
//执行sql失败
}
NSString *query = @"select ID,msg from Student order by ID";
sqlite3_stmt *statement;
//查询到statement中
sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil);
//遍历结果集
while (sqlite3_step(statement) == SQLITE_ROW) {
int rowNum = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);
//转成OC的数据模型
NSString *msg = [NSString stringWithUTF8String:rowData];
}
//标识查询遍历完成
sqlite3_finalize(statement);
//绑定变量操作
char *insertSql = "insert into Student values(?,?)";
sqlite3_stmt *insertStmt;
if (sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, nil)==SQLITE_OK) {
//预处理成功,对指定的字段绑定值
//第一个问题对应的值设为235
sqlite3_bind_int(insertStmt, 1, 235);
//对第二个?对应的值设为Good Student;-1可直接代替Good Student的长度。最后一个参数一个函数,用于做一些在语句执行完成后做一些清理操作,一般是使用malloc使用一些清理操作
sqlite3_bind_text(insertStmt, 2, "Good Student", -1, NULL);
}
if (sqlite3_step(insertStmt)==SQLITE_DONE) {
//用表示SQLITE_DONE数据更新成功
}
}
//使用完成后关闭数据库
sqlite3_close(database);
[注意:在C语言中,若两个内联的字符串之间只有空白(包括换行符)而没有其他字符,那么这两个字符串会被连接到一起,故一般使用NSString 后再转换成C下的字符串]
【在需要频繁使用数据库时,可能有必要始终打开连接】
+Core data +
是苹果的一款稳定、功能全面的持久化工具;是一种包装了sql操作的可视化工具;内部是使用sqlite持久化数据,但不需要写sql语句,只需要操作对象,由内部的Core data完成;
数据存储在Document目录下;
【但除使用sqlite保存外也可指定使用二进制文件或内存形式来存储】
New File -> Data Model,生成一个.xcdatamodel文件;该文件包含我们的数据模型。可用于直观的设计数据模型而无需编写代码,并将数据模型存储在.xcdatamodel文件中;不需要创建类,而是先在数据模型编辑器中直接创建实体,然后在代码中为这些实体创建托管对象;
实体的3个属性:
特性(attribute):与实例变量在OC类中的作用是完全相同的,都用于保存数据;
关系(relationship):实体间的对应关系,如外键关联等;
提取属性(fetched property):是关系的一个备选方法,可创建一个可在提取时被评估的查询,从而确定哪些对象属于这个关系。通常是一对一的关系;也是唯一一种能跨越多个数据存储的关系;
操作:
NSManagedObjectModel:被管理对象模型,是系统中的实体,与数据库中的表等对象相对应;
NSManagedObjectContext:被管理对象上下文,可查找、删除和插入对象,然后再同步到持久化存储中;
NSPersistentStoreCoordinator:持久化存储协调器;在持久化对象上提供了一个接口可认为是与数据库的连接;
博客地址:IOS开发学习笔记之数据存储