除’其余的都是在特殊字符前面加“/”,而 ' -> '' 。方法:keyWord = keyWord.replace("/","//");css
NSManagedObjcet是NSObject的子类,Core Date的重要组成部分。是一个通用类,实现了Core Date模型层所需的基本功能,用户能够经过NSManagedObjcet创建本身的数据模型。html
1> CoreData是对SQLite数据库的封装 2> coreData中有三个对象是必须掌握的, NSManagedObject :只要定义一个类继承于该类就会建立一张与之对应的表, 也就是一个继承于该类的类就对应一张表. 每个经过继承该类建立出来的对象,都是该类对应的表中的一条数据 NSManagedObjectContext: 用于操做数据库, 只要有类它就能对数据库的表进行增删改查 NSPersistentStoreCoordinator: 决定数据存储的位置 (SQLite/XML/其它文件中) 3> Core data自己并非一个并发安全的架构因此在多线程中实现Core data会有问题.问题在于 >2.1 CoreData中的NSManagedObjectContext在多线程中不安全 >2.2若是想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext >2.3每一个NSManagedObjectContext对象实例均可以使用同一个NSPersistentStoreCoordinator实例,这是由于NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁
SQLite是目前主流的嵌入式关系型数据库,其最主要的特色就是轻量级、跨平台,当前不少嵌入式操做系统都将其做为数据库首选。git
虽然SQLite是一款轻型数据库,可是其功能也毫不亚于不少大型关系数据库。github
学习数据库就要学习其相关的定义、操做、查询语言,也就是你们平常说得SQL语句。和其余数据库相比,SQLite中的SQL语法并无太大的差异,所以这里对于SQL语句的内容不会过多赘述,你们能够参考SQLite中其余SQL相关的内容,这里仍是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特色:面试
Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操做过程一般分为如下几个步骤:算法
iOS中能够有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Datasql
coredata可使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。数据库
coredata提供了基础结构去处理经常使用的功能,例如保存,恢复,撤销和重作,容许你在app中继续建立新的任务。编程
在使用coredata的时候,你不用安装额外的数据库系统,由于coredata使用内置的sqlite数据库。数组
coredata将你app的模型层放入到一组定义在内存中的数据对象。
coredata会 追踪这些对象的改变,同时能够根据须要作相应的改变,例如用户执行撤销命令。
当coredata在对你app数据的改变进行保存的时 候,core data会把这些数据归档,并永久性保存。
mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。能够在多个平台使用,sqlite是一个轻 量级的嵌入式sql数据库编程。
与coredata框架不一样的是,sqlite是使用程序式的,sql的主要的API来直接操做数据表。
Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。
虽然Core Dta支持SQLite做为一种存储类型, 但它不能使用任意的SQLite数据库。
Core Data在使用的过程种本身建立这个数据库。Core Data支持对1、对多的关系。
博客地址: http://blog.csdn.net/jasonblog/article/details/17842535
博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398
数据库左链接和右链接的区别:主表不同经过左链接和右链接,最小条数为3(记录条数较小的记录数),最大条数为12(3×4)
沙盒结构
App Bundle 里面有什么
使用keychain来存储,也就是钥匙串,使用keychain须要导入Security框架
自定义一个keychain的类
#import <Security/Security.h> @implementation YCKKeyChain +(NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass, service, (__bridge_transfer id)kSecAttrService, service, (__bridge_transfer id)kSecAttrAccount, (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock, (__bridge_transfer id)kSecAttrAccessible, nil]; } +(void)save:(NSString *)service data:(id)data { // 得到搜索字典 NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; // 添加新的删除旧的 SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); // 添加新的对象到字符串 [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData]; // 查询钥匙串 SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL); } +(id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; // 配置搜索设置 [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData]; [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey: (__bridge_transfer id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData]; } @catch (NSException *e) { NSLog(@"Unarchive of %@ failed: %@", service, e); } @finally { } } return ret; } +(void)delete:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery); }
在别的类实现存储,加载,删除敏感信息方法
// 用来标识这个钥匙串
static NSString const KEY_IN_KEYCHAIN = @"com.yck.app.allinfo";
// 用来标识密码
static NSString const KEY_PASSWORD = @"com.yck.app.password";
+(void)savePassWord:(NSString *)password { NSMutableDictionary *passwordDict = [NSMutableDictionary dictionary]; [passwordDict setObject:password forKey:KEY_PASSWORD]; [YCKKeyChain save:KEY_IN_KEYCHAIN data:passwordDict]; } +(id)readPassWord { NSMutableDictionary *passwordDict = (NSMutableDictionary *)[YCKKeyChain load:KEY_IN_KEYCHAIN]; return [passwordDict objectForKey:KEY_PASSWORD]; } +(void)deletePassWord { [YCKKeyChain delete:KEY_IN_KEYCHAIN]; }
if([[NSUserDefaults standardUserDefaults] objectForKey:ID] == nil){ NSLog(@"没有设置"); }
作过加密相关的功能的,几乎都会使用到MD5和Base64,它们二者在实际开发中是最经常使用的。
• MD5:是一种不可逆的摘要算法,用于生成摘要,没法逆着破解获得原文。经常使用的是生成32位摘要,用于验证数据的有效性。好比,在网络请求接口中,经过将全部的参数生成摘要,客户端和服务端采用一样的规则生成摘要,这样能够防篡改。又如,下载文件时,经过生成文件的摘要,用于验证文件是否损坏。 • Base64:属于加密算法,是可逆的,通过encode后,能够decode获得原文。在开发中,有的公司上传图片采用的是将图片转换成base64字符串,再上传。在作加密相关的功能时,一般会将数据进行base64加密/解密。
1> 设置数据库锁定的处理函数 int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); 函数能够定义一个回调函数,当出现数据库忙时,sqlite会调用该函数 当回调函数为NULL时,清除busy handle,申请不到锁直接返回 回调函数的第二个函数会被传递为该由这次忙事件调用该函数的次数 回调函数返回非0,数据库会重试当前操做,返回0则当前操做返回SQLITE_BUSY 2> 设定锁定时的等待时间 int sqlite3_busy_timeout(sqlite3*, 60); 定义一个毫秒数,当未到达该毫秒数时,sqlite会sleep并重试当前操做 若是超过ms毫秒,仍然申请不到须要的锁,当前操做返回sqlite_BUSY 当ms<=0时,清除busy handle,申请不到锁直接返回
文章若有问题,请留言,我将及时更正。