iOS学习笔记OSiOS面试题iOS面试

可能碰到的iOS笔试面试题(14)--数据存储

2016-05-04  本文已影响2993人  b485c88ab697

数据存储

sqlite中插入特殊字符的方法和接收到处理方法。

除’其他的都是在特殊字符前面加“/”,而 ' -> '' 。方法:keyWord = keyWord.replace("/","//");

什么是NSManagedObject模型?

NSManagedObjcet是NSObject的子类,Core Date的重要组成部分。是一个通用类,实现了Core Date模型层所需的基本功能,用户可以通过NSManagedObjcet建立自己的数据模型。

你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

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前上锁

简单描述下客户端的缓存机制?

什么是序列化和反序列化,用来做什么

OC中实现复杂对象的存储

iOS中常用的数据存储方式有哪些?

  1. 数据存储有四种方案,NSUserDefault,KeyChain,File,DB.
  2. 其中File有三种方式:plist,Archiver,Stream
  3. DB包括core Data和FMDB

说一说你对SQLite的认识

说一说你对FMDB的认识

说一说你对Core Data的认识

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过程通常分为以下几个步骤:

OC中有哪些数据存储方式,各有什么区别?

iOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

SQLite数据存储是怎么用?

简单描述下客户端的缓存机制?

你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

Core Data数据迁移

博客地址: http://blog.csdn.net/jasonblog/article/details/17842535

FMDB的使用和对多张表的处理

博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398

说说数据库的左连接和右连接的区别

iOS 的沙盒目录结构是怎样的? App Bundle 里面都有什么?

  1. 沙盒结构

    • Application:存放程序源文件,上架前经过数字签名,上架后不可修改
    • Documents:常用目录,iCloud备份目录,存放数据,这里不能存缓存文件,否则上架不被通过
    • Library
      • Caches:存放体积大又不需要备份的数据,SDWebImage缓存路径就是这个
      • Preference:设置目录,iCloud会备份设置信息
    • tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
  2. App Bundle 里面有什么

    • Info.plist:此文件包含了应用程序的配置信息.系统依赖此文件以获取应用程序的相关信息
    • 可执行文件:此文件包含应用程序的入口和通过静态连接到应用程序target的代码
    • 资源文件:图片,声音文件一类的
    • 其他:可以嵌入定制的数据资源

你会如何存储用户的一些敏感信息,如登录的 token

使用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];
}

使用 NSUserDefaults 时,如何处理布尔的默认值?(比如返回 NO,不知道是真的 NO 还是没有设置过)

if([[NSUserDefaults standardUserDefaults] objectForKey:ID] == nil){
    NSLog(@"没有设置");
}

MD5和Base64的区别是什么,各自使用场景是什么?

做过加密相关的功能的,几乎都会使用到MD5和Base64,它们两者在实际开发中是最常用的。
•   MD5:是一种不可逆的摘要算法,用于生成摘要,无法逆着破解得到原文。常用的是生成32位摘要,用于验证数据的有效性。比如,在网络请求接口中,通过将所有的参数生成摘要,客户端和服务端采用同样的规则生成摘要,这样可以防篡改。又如,下载文件时,通过生成文件的摘要,用于验证文件是否损坏。
•   Base64:属于加密算法,是可逆的,经过encode后,可以decode得到原文。在开发中,有的公司上传图片采用的是将图片转换成base64字符串,再上传。在做加密相关的功能时,通常会将数据进行base64加密/解密。

plist文件是用来做什么的。一般用它来处理一些什么方面的问题。

当存储大块数据是怎么做?

怎么解决sqlite锁定的问题

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,申请不到锁直接返回

文章如有问题,请留言,我将及时更正。

满地打滚卖萌求赞,如果本文帮助到你,轻点下方的红心,给作者君增加更新的动力。

上一篇 下一篇

猜你喜欢

热点阅读