IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
1.每个应用程序都在自己的沙盒内
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
3.应用程序向外请求或接收数据都需要经过权限认证
一个沙盒中包含了四个部分:分别是.app文件,这个就是可运行的应用文件,Documents,苹 果建议将程序中创建的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录;Library,存储程序的默认设置或其它 状态信息;Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除;tmp,创建和存放临时文件的地 方。
13.SQLite (增删改查,表)
NSString *strSql = [NSString stringWithFormat: @"INSERT INTO lanou20 (name,sex,age) VALUES ('%@','%@','%ld')" ,person.name,person.sex,person.age];
NSString *delSql = [NSString stringWithFormat:@"delete from lanou20 where pid = '%ld'",pid];
NSString *updataSql = [NSString stringWithFormat:@"UPDATE lanou20 SET name = '%@' WHERE pid = '%ld' “,name,pid];
NSString *strSql = @"select * from lanou20”;
NSString *sql = @"CREATE TABLE IF NOT EXISTS lanou20 (pid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , name TEXT check(typeof(name) = 'text') , sex TEXT check(typeof(sex) = 'text') , age INTEGER)";
3.iOS中哪些数据持久化的方式,各有什么特点,iOS平台怎么做数据的持久化,CoreData和sqlite有无必然联系?CoreData是一个关系型数据库吗?
答:iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;Core Data可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用Core Data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。Core Data将你app的模型层放入到一组定义在内存中的数据对象中。Core Data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当Core Data在对你app数据的改变进行保存的时候,Core Data会把这些数据归档,并永久性保存。
mac os X中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与core data框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。
Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型,但它不能使用任意的SQLite数据库。Core Data在使用的过程中自己创建这个数据库。Core Data支持对一、对多的关系。
14.什么是沙盒?
答:所谓的沙盒其实是操作系统为应用程序分配的一个密闭文件夹。应用程序拥有这个文件夹内文件的访问权限,且只能对这个文件夹内的文件进行操作(当然也可以访问系统提供的文件,比如:相册),不可以去访问其他应用程序的文件夹。
12.在沙盒中有几个文件夹?
答:沙盒含有3个文件夹:Documents, Library 和 tmp
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。
Library:存储程序的默认设置或其它状态信息。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
Library/Caches:存放缓存文件,一般是下载的图片和视频,iTunes不会备份此目录,此目录下文件不会在应用退出删除。
tmp:临时文件夹,应用程序在重启时,会丢弃所有的tmp文件。
13.NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别?
获取这些目录路径的方法:
1,获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2,获取Documents目录路径的方法:
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,获取Caches目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();
5,获取应用程序程序包中资源文件路径的方法:
例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 代码中的mainBundle类方法用于返回一个代表应用程序包的对象。
1、用coredata的时候,如果用户更新个人信息了,怎么用代码来更新页面上显示的个人信息
(1)当用户更新了自己的用户信息,保存更新数据到数据库
(2)当用户返回更新页面时先查询数据库中的内容,显示到页面上就可以。
查询数据库的代码:
// 创建请求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// 创建实体描述
NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:content];
[request setEntity:entity];
[request setReturnsObjectsAsFaults:NO];
// 设置谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self = %@", data];
[request setPredicate:predicate];
// 执行请求
NSArray *dataArray = [content executeFetchRequest:request error:nil];
// 修改信息
if ([dataArray count] > 0) {
TaskTypeEntity *taskTypeEntity = [dataArray objectAtIndex:0];
taskTypeEntity.color = data.color;
taskTypeEntity.status = data.status;
taskTypeEntity.image = data.image;
BOOL result = [content save:nil];
if (result) {
NSLog(@“保存成功");
}else{
NSLog(@"保存失败");
}
}
保存数据成功之后,在个人信息显示页面重复上述步骤查询之后直接更新数据。
5 在 Coredata中如何判断数据库是否存在,(不做增删改查来判断表是否存在)。
判断一下路径是否存在,使用NSfileManager
1、数据持久化存储方式有哪些
四种存储方式: 1.NSUserDefaults,用于存储配置信息2.SQLite,用于存储查询需求较多的数据3.CoreData,用于规划应用中 的对象4.使用基本对象类型定制的个性化缓存方案.
NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也 可以按照自己的需求创建新的配置项。
SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可 以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库 中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。
CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进 行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状 态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。 无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不 是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全 基于CoreData架构应用。
使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常 操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期 等。
10)本地收藏功能,收藏的内容如果变了,用户手机显示的收藏内容也跟着变,怎么实现
解析数据后 判断收藏的内容 与 新的数据 是否相同 如果不一样,说明数据已经改变,这时候更新数据
6、无网情况下,从本地数据库sqlite上拉加载时,每次取10条,如何实现?
判断网络情况,在无网络情况下,上拉加载的时候,通过谓词设置从数据库中取出数据10条数据,刷新界面。
5.用coredata的时候,如果用户更新个人信息了,怎么用代码来更新页面上显示的个人信息
(1)当用户更新了自己的用户信息,保存更新数据到数据库
(2)当用户返回更新页面时先查询数据库中的内容,显示到页面上就可以。
查询数据库的代码:
// 创建请求
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// 创建实体描述
NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:content];
[request setEntity:entity];
[request setReturnsObjectsAsFaults:NO];
// 设置谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self = %@", data];
[request setPredicate:predicate];
// 执行请求
NSArray *dataArray = [content executeFetchRequest:request error:nil];
// 修改信息
if ([dataArray count] > 0) {
TaskTypeEntity *taskTypeEntity = [dataArray objectAtIndex:0];
taskTypeEntity.color = data.color;
taskTypeEntity.status = data.status;
taskTypeEntity.image = data.image;
BOOL result = [content save:nil];
if (result) {
NSLog(@“保存成功");
}else{
NSLog(@"保存失败");
}
}
保存数据成功之后,在个人信息显示页面重复上述步骤查询之后直接更新数据。
13、数据库增、删、改、查语句书写
insert 、 delete 、 update 、 select 增删改查的关键字
1. insert into table name (data type fieldname,data type fieldname...)values (value1,value2.....);
2. delete from table name where id = 23;
3. update table name set 字段名 = 新值;
4. select * from 表名 where id = 2;
39.SQL语句问题:inner join、left join、right join的区别是什么?
left/ right join 是外部链接,inner join 是内连接
外部链接有主表和从表,主表在left中是左侧表,right中是右侧表,主表数据会全部显示,从表数据只显示关联部分匹配数据,无匹配的数据用null补全。内连接则只显示两表关联条件匹配的数据
注:所谓关联条件即是指on 的条件
40.sqlite的优化。
数据库在使用的时候一定要与多线程相结合的。项目中用到了数据库,假如其中一个表有33万条数据。对这个表进行查询,执行类似“SELECT * FROM table1 where ds_key like 'asd%%'”这样的语句,在Touch上用了大概11秒,体验很差。
调查发现,虽然已经对table1增加了索引,但是在实际执行的时候,如果查询条件包含LIKE,就不会使用索引。
想知道查询是不是用了索引,可以参考
http://www.sqlite.org/eqp.html这个链接提供的方法进行验证。
而改成“SELECT * FROM table1 where ds_key >= 'asd' and ds_key < 'ase'”这样的语句,查询时就会使用到索引,花费时间只有零点几秒,效率提高了几十倍。
当然,这只针对查询以某个字符串开头的记录的情况,而对于like '%%asd%%'这样的就没法优化了。
103.不同版本的APP,数据库结构变化了,如何处理?(数据库迁移)
数据库迁移问题,一般项目中使用数据框架有两种Sqlite和CoreData。
在Sqlite中有Alter命令修改数据库的结构和库名。
//对于老用户,数据库已经存在,需要修改
1.查询旧表NSString *searchSql = [NSString stringWithFormat:@"select sql from sqlite_master where tbl_name='表名' and type='table'"];
2.若找到旧表,判断是否存储记录,添加新字段或改名
NSString *sql_add = "ALTER TABLE 表名 ADD 字段名 字段类型”;
或者修改表名
ALTER TABLE 原表名 RENAME TO 新表名;
3.执行改sqlite3_exec(数据库, sql_add, NULL, NULL, NULL)!=SQLITE_OK。
4.释放伴随指针。
64.同一个工程中ARC和非ARC 的如何混合使用?
点击项目->TARGETS->Build Phases->Compile Sources中选择要改的.m,双击,在标签中添加:
1.如果是ARC项目,要加入非ARC的代码文件:-fobjc-arc
2.如果是非ARC,要加入ARC的代码:-fno-objc-arc
回车
第二十题:
coredata
中
NSPersistentStoreCoordinator
和
NSManagedObjectContext
和
NSManaged
哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?
在多线程环境中使用
CoreData
2.
多表数据库操作;
数据库中多表的之间根据某些字段建立关联,多表之间的关系包括一对一,一对多,多对多,进行增删改查具体的操作需要去写
sql
语句。
coreData
中多表的操作可以查看这个博客中的内容