一:iOS 中存储数据的方法
用户配置(NSUserDefault),plist,归档(NSKeyedArichiver), 写入磁盘, 数据库(sqlite/coreData)
二: 数据持久化之数据库
1. sqlite 第三方库:FMDB(下载链接)
1》建库
NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
//该文件路径无需真实存在,如果不存在会自动创建
//路径为@“”:表示会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,文件也会被删除
//路径为NULL:将创建一个内在数据库,同样的,当FMDatabase连接关闭时,数据将会被销毁
NSString *fileName = [doc stringByAppendingPathComponent:@"student.sqlite"];
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
2》打开库
[db open]
3》建表
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS myAir (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, type text NOT NULL);"];
4》添加数据
BOOL b= [db executeUpdateWithFormat:@"insert into myAir (name,type) values (%@,%@);",name,name];
往数据库中添加了数据时候可使用火狐浏览器安装SQLite Manager 查看sqlite 文件的数据: https://addons.mozilla.org/zh-cn/firefox/addon/sqlite-manager/
5》删除
BOOL b=[db executeUpdateWithFormat:@"delete from myAir where id = %d;",1];
6》修改
BOOL b= [db executeUpdate:@"update myAir set name = ? where id = ?",@"M999",@"1"];
7》查询并读取数据
//查询整个表的数据
FMResultSet *resultSet = [db executeQuery:@"select * from myAir;"];
//按条件模糊查询
FMResultSet *resultSet2 = [db executeQuery:[NSString stringWithFormat:@"select * from myAir where name like '%%%@%%';",@"5"]];
注意: 模糊查询 like '% 5%' 在oc 中 打印% 需要两个 %%
//读取数据
while ([resultSet next]){
NSString *name = [resultSet objectForColumn:@"name"];
[_dataList addObject:name];
}
8》关闭数据库
[db close];
2. coreData 第三方库: MagicalRecord(下载链接,使用详情)
1》添加
[对象 MR_createEntity]
2》删除
[对象名 MR_deleteEntity];
3》查询
a: 查找所有 : [对象 MR_findAll];
b:根据条件查询:
b1 :使用谓词 NSPredicate
如: NSPredicate *pre=[NSPredicate predicateWithFormat:@"name CONTAINS %@",@"5"];
ENDSWITH 表示以什么结尾;BEGINSWITH 表示以什么开头;CONTAINS 表示是否包含指定字符或字符串;LIKE 模糊查找 * 代表0个或多个字符,?代表一个字符;MATCHES 匹配正则表达式
[对象 MR_findAllWithPredicate:pre ];
[对象 MR_ascendingSortDescriptors:要排序的数组名]; //对某数组进行排序
b2: 根据实体属性名对应的值进行查找
如:[对象 MR_findByAttribute:@"name" withValue:@"张三"]; //将对象中 name=张三的人找出来
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; //对name 属性进行排序 ascending:yes 递增 递减
b3: 对多个列进行排序
NSArray *result = [Note findAllSortedBy:@"date:NO,name" ascending:YES];
//表示 date 字段降序,name字段升序。
4》修改
//先查找出要修改的对象再进行修改
NSPredicate *pre=[NSPredicate predicateWithFormat:@"id = %@",@"1"];
NSArray *obj= [Person MR_findAllWithPredicate:pre ];
for (Person *p in obj) {
p.name=@"other";
}
5》注意: 除了查询之外 ,对实体进行操作了之后,都要加上以下语句
[[NSManagedObjectContext MR_defaultContext]MR_saveToPersistentStoreAndWait];
6》MagicalRecord 中NSpredicate的使用和延伸: http://blog.csdn.net/sinat_25544827/article/details/45956169
7》数据库的迁移
3. sqlite 与coreData 的比较
sqlite: 需要使用sql语句,使用起来比较麻烦,代码量较大。
coreData:操作简单,容易理解。