sqliteiOS开发-数据持久化

1、创建新类型勾选使用coreData

static NSString * const kUserNameKey = @”userName”;

NSMutableData \ recordData = [NSMutableData data];*

对此自由自定义类型的数量,只要遵从上面的手续,就能对数据开展归档了。那里还要讲一下一个小技巧:使用static修饰来代替宏定义。上面的体系化中,大家能够看来NSCoding的磋商方式中对数据开展连串化并且利用一个key来保存它。正常意况下大家得以应用宏来定义key,可是过多的宏定义在编译时也会造成大气的损耗。那时候可以运用static定义静态变量来替代宏定义。

NSString \ executeSql = @”select * from table student where name
like ‘张%'”;*


2、创造关系模型,在此地我创设的模子名字是LXDCoreDataDemo

@end 

dic[[NSString stringWithUTF8String: name]] = [NSString
stringWithUTF8String: (const char \
)value];*


const char \ name = sqlite3_column_name(stmt, i);  //取到列名*

AppDelegate \appDelegate = [[UIApplication sharedApplication]
delegate];*

2、给这一个plist文件命名cities,点击Create后创立好。然后大家选中Root,默许已经是字典的数据结构存储了,我们点击Root左侧的加号添加一些键值对,然后修改左侧的key的文字,并且将每一个key对应的value设置为Array数组

属性列表是一种公开的轻量级存储形式,其储存格式有多种,最常规格式为XML格式。在大家创制一个新的门类的时候,Xcode会自动生成一个info.plist文件用来存储项目标一对系统安装。plist只能用数组(NSArray)或者字典(NSDictionary)进行读取,由于特性列表本身不加密,所以安全性大概可以说为零。因为,属性列表正常用于存储少量的还要不首要的数量。

**NSMutableArray \ rows = [NSMutableArray new];

3、按照在字典中添加键值对的章程,在装置好每个key对应的档次之后,移动到每一行下面点击出现的+给每一个省份添加数组元素,并且赋值,最后效果图如下

@property (nonatomic, copy) NSString \ userName;*

2、执行SQL语句。有重回值的语句执行第四步,无重回值的实践第三步


三、复杂的数据模型的数目建表相对而言相比较麻烦。

NSFetchRequest \request = [NSFetchRequest new];*

/\* 使用NSKeyedArchiver对数码举办连串化*/*

int columnCount = sqlite3_column_count(stmt);  //获取列数

4、对于有再次来到值的SQL语句首先通过sqlite3_prepare_v2()进行语法评估,然后经过sqlite3_step()函数依次取出查询结果的每一行数据,最终经过sqlite3_column_type()方法赢得对应列的数额

@interface LXDGameRecord : NSObject<NSCoding>

coreData

属性列表

由于大家不需求关爱数据的积存,coreData使用起来算是最简便易行的持久化方案。要动用coreData有五个章程,一个是在创制项目的时候勾选use
core data,另一个则是手动成立。在那里大家要上课的是前者创立的形式

NSArray \results = [[context executeFetchRequest: request error:
&error] copy];*

@end

NSKeyedUnarchiver \ unarchiver = [[NSKeyedArchiver alloc]
initForReadingWithData: fileData];*

//保存新数据

除此以外,还有一个NSUserDefault,其协助的数量格式有:NSNumber(Integer、Float、Double等)、NSString、NSDate、NSArray(成员必须也是永葆的格式类型)、NSDictionary(同NSArray)。其使用和读取也是那一个的概括,像字典一样的存取格局

    [aCoder encodeObject: self.createDate forKey:
kCreateDateKey];

if (SQLITE_OK != sqlite3_exec(_database, executeSql.UTF8String,
NULL, NULL, &error)) {

– (void)encodeWithCoder:(NSCoder \)aCoder*

} else {

1、创建plist文件。New Files -> iOS -> Resource -> Property List
-> Next

**char \ error;

读取:NSString * str = [[NSUserDefaults standardUserDefaults]
valueForKey: @”str”];

数量归档/连串化

[appDelegate saveContext];

依据sqlite封装的FMDB几乎是本身工作中最常用到的持久化方案。在实际上支付中,sqlite占用的内存卓殊可怜的少,在嵌入式设备中,可能只要求几百K即可。其次,它的快慢特其余快,大概快过所有别的的数据库。当然啦,起先使用数据库举办付出以前,你得询问sqlite协助的数据类型,包涵NULL(空值)、Integer(整型)、Real(实数)、Text(字符串)、BLOB(二进制)

越多时候,NSUserDefaults已经提供了蕴藏不难变量的持久化方案。可是,当大家想要存储复杂的自定义数据时,NSUserDefaults无法为我们提供更多的拉扯,这时候考虑的是别的的持久化方案。而不要所有的先后都急需查询数据、数据迁移那么些操作,而且也不要所有的多少都有复杂的涉及图。这时候,数据归档相对是不二的拔取。

同等的也足以利用setObject:forKey:或者objectForKey:等字典存取方法

[request setEntity: entity];

在先后开发中,数据层永远是程序的骨干结构之一。大家将现实事物举行抽象,使之成为一个个多少。对这几个多少的加工处理是代码中能突显技术水平的一大模块,比如数据的请求、解析、缓存、持久化等等。适当的对数码举办持久化存储可以完结采纳的离线功效,以此进步用户体验。在iOS开发中,苹果提供了四种持久化方案供大家接纳。那些方案分别包罗属性列表(plist)、数据归档(NSKeyedValueArchiver/NSUserDefaults)、数据库(sqlite)和coreData等,它们的分别如下

***//先取出coredata上下文管理者

文集:iOS开发

person.age = @([_userAge.text integerValue]);

sqlite3_stmt \ stmt;        //检查语法正确性*


当然,像那种城市的plist文件百度时而就足以找到,可是创造plist的章程相信我们看完未来也就知道了。从plist读取数据的艺术也很简短,苹果把读取的不二法门封装在NSArray跟NSDictionary中,读取步骤分为两步:

当然,它也存有明确的症结:

[archiver finishEncoding];  //落成种类化操作

与特性列表相反,同样作为轻量级存储的持久化方案,数据归档是进展加密处理的,数据在经过归档处理会转换成二进制数据,所以安全性要远远不止属性列表。其它利用归档方式,我们得以将复杂的对象写入文件中,并且不管添加多少对象,将目的写入磁盘的艺术都是同一的。

***@implementation LXDGameRecord

NSLog(@”数据库打开成功!”);

完结选拔器的几乎思路是用多个数组分别存储省份以及当前选中省份的都市数组,然后在滑行pickerView的回调事件中根据选中的省份更新城市数据源。

二、它按照C语言框架设计,没有面向对象的API,所以利用起来相比较麻烦;

NSString \ filePath = [documentDirectory
stringByAppendingPathComponent: dbName];*

[recordData writeToFile: filePath];  //系列化完结后写入当地磁盘

while (SQLITE_ROW == sqlite3_step(stmt)) {

本来,大家也足以采纳基于sqlite封装的开源数据库FMDB来裁减使用sqlite的工作量

}

/\* 协议章程-对数码开展体系化*/*


数量归档/数据体系化

/\* 协议章程-对数据开展反连串化并读取*/*

person.name = _userName.text;

}

coreData是iOS5后头苹果推出的数码持久化框架,其提供了ORM的意义,将对象和数量交互转换。其中,它提供了包罗sqlite、xml、plist等当地存储文件,默许使用sqlite举行仓储。coreData具有多个模型:关系模型和对象模型,关系模型即是数据库,对象模型为OC对象。其涉及图如下

if (SQLITE_OK == sqlite3_prepare_v2(_database,
executeSql.UTF8String, -1, &stmt, NULL)) {

属性列表

sqlite3_finalize(stmt);

一、可以储存大批量的数码,存储和搜索的进程尤其快;二、能对数据开展多量的汇集,这样比起利用对象来举办那些操作要快。

数据库

**@property (nonatomic, strong) NSDate \ createDate;

采取LXDCoreDataDemo -> Next -> Person ->
Create,大家就创建好了Person,那时候七个成员属性都会自行抬高达成


}

在先后启动后,系统会活动创设一个NSUserDefaults的单例对象,大家得以获得这几个单例来储存少量的多少,它会将出口存储在.plist格式的公文中。其亮点是像字典一样的赋值形式方便简单,但缺点是无能为力储存自定义的数目。

}

for (Person \p in results) {*

在我们每便创制新的门类的时候,Xcode辅助大家转变了Info.plist文件,里面储存了有关项目名字、版本、bundle
id等等紧要音讯,这些plist文件也是逆向工程(越狱)中取得app数据的首要文件。OK,那么如何情况下用plist存储呢?打个比方,近期在落到实处集团项目工作的时候,必要运用选拔器(UIPickerView)给用户选用所在城市。对于城市数目,并不曾加密的画龙点睛,而且此时使用plist会达到更高一些的频率。既然已经知道必要的数目,那么很简单就得得出省-市那样的一对多的数据类型,大家的plist使用字典,将省份作为key,存储对应的都市的数组作为value

NSEntityDescription \entity = [NSEntityDescription entityForName:
@”Person” inManagedObjectContext: context];*

//单步执行sql语句

NSData \ fileData = [NSData dataWithContentFile: filePath];*

}

**static NSString \ const dbName = @”myDBText.db”;

想要对coreData有更尖锐的领会可以买入这本Core
Data应用开发实践指南
,里面详细描述了coreData的各样应用技术。

NSKeyedArchiver \ archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData: recordData];*

随即自己使用故事板创造了上边的视图,在自家点击按钮的时候往数据库中插入新的person数据

}


2、通过数组或者字典的构造器方法创立容器:


NSDictionary * dict = [NSDictionary dictionaryWithContentsOfFile:
filePath];

NSArray \ datas = [unarchiver decodeObjectForKey: kArchiveKey];  
//反序列化*

3、对于无重临值的SQL语句(包涵增删改等操作)通过sqlite3_exec()函数执行

存储:[[NSUserDefaults standardUserDefaults] setValue: @”str” forKey:
@”str”];

person.name = _userScore.text;

***    self.createDate = [aDecoder decodeObjectForKey:
kCreateDateKey];

}

if (SQLITE_OK == sqlite3_open(filePath.UTF8String, &_database))
{

到了那里大家的实体模型就成立好了,接下去就是通过NSManagedObject来将实体模型转换成对象。通过从coreData取出的对象,全部都是继承自NSManagedObject的子类。那么大家要求根据当下的涉及模型来创立Person类

上边浮现的是早已学习时仿qq登录界面中使用数据归档存储用户注册的账号(由于没有服务器,只好存储在地点),其中用户的多寡包涵了昵称、头像图片、用户账号、密码那个数量,在输入完账号自己从代理方法中走访这个数据并得到用户的头像

NSString \ filePath = [self applicationDocumentStorage];*


1、使用sqlite3_open(const char *filename, sqlite3
**ppDb)方法打开指定路线下的数据库存入到成立的数据库变量中,如若存在数据库就打开。不设有数据库则关闭。成功开拓数据库的时候会再次回到SQLITE_OK

[unarchiver finishDecoding];  //已毕反系列化

//查询所有数据

在选拔sqlite前要导入libsqlite3.0框架,然后导入<sqlite3.h>头文件。其操作步骤大致如下:

}

对此我们开发者而言,使用合适的持久化方案得以帮助我们收获更高的支付成效。更快的数码加载速度能够显著增加利用的用户体验感。

3、在开立的涉嫌模型中添加实体,命名为Person,并且增进多少个字段:name、age、score

让自定义的多寡遵从NSCoding商量后,我们就能选择NSKeyedArchiver和NSKeyedUnarchiver来对持久化的数量进行存取操作了

拔取NSKeyedArchiver对自定义的多寡开展连串化,并且保留在沙盒目录下。使用那种归档的前提是让存储的数据模型坚守NSCoding协议并且完毕其七个协议形式。(当然,借使为了尤其安全的囤积,也得以遵循NSSecureCoding共商,这是iOS6之后新增的表征)

NSMutableDictionary \ dic = [NSMutableDictionary dictionary];*


NSLog(@”%@, %@, %@”, p.name, p.age, p.score);

coreData

Person \person = [NSEntityDescription
insertNewObjectForEntityForName: @”Person” inManagedObjectContext:
context];*


咱俩使用archive格式的文件将归档化的多少存储在沙盒目录下,那种格式的文书读取出来是二进制数据(NSData),然后使用NSKeyedUnarchiver类对数据开展反系列化。假诺当前亟待开展持久化存储的是一款离线游戏,我急需仓储游戏前十名的战表、战绩持有者和记录创设时间那一个多少,那么相对应的LXDGameRecord类注解如下,其必须按照NSCoding或NSSecureCoding协议之一:



[archiver encodeObject: datas forKey: kArchiveKey];
 //系列化数据

    [aCoder encodeObject: self.score forKey: kScoreKey];


sqlite数据库

    self.userName = [aDecoder decodeObjectForKey: kUserNameKey];

NSLog(@数据库打开战败!“);

[rows addObject: dic];


//NSArray * array = [NSArray arrayWithContentsOfFile: filePath];

在进行操作的类完毕公文中,大家要投入AppDelegate和Person的头文件,因为在开立项目的时候若是大家勾选了use
core
data的选项,appDelegate文件中会帮我们转变用于管理、存储这个模型的靶子,大家可以通过添加头文件来利用。插入数据的代码如下:

const unsigned char \ value = sqlite3_column_text(stmt, i);
//取得某列的值*

coreData是苹果官方iOS5后头推出的综合型数据库,其应用了ORM(Object
Relational
Mapping)对象关系映射技术,将对象转换成数据,存储在本土数据库中。coreData为了升高效能,甚至将数据存储在不一样的数据库中,且在应用的时候将当地数据放到内存中使得访问速度更快。大家得以选用coreData的多寡存储格局,包含sqlite、xml等格式。但也多亏coreData
是一心面向对象的,其在执行效用上不如原生的数据库。除此之外,coreData拥有数据表明、undo等其余职能,在功能上是四种持久化方案最多的。

#pragma mark – NSCoding

{

***    self.score = [aDecoder decodeObjectForKey: kScoreKey];

– (id)initWithCoder: (NSCoder \)aDecoder*


for (int i = 0; i < columnCount; i++) {

/\* 使用NSKeyedUnArchiver对数码反种类化并读取*/*

    [aCoder encodeObject: self.userName forKey: kUserNameKey];

NSError \error;*

{

@property (nonatomic, strong) NSNumber \ score;*

sqlite是一个轻量级、跨平台的袖珍数据库,其所有可移植性高、有着和MySql大概一样的数据库语句以及不要服务器即可使用的独到之处:

NSManagedObjectContext \context =
appDelegate.managedObjectContext;*

sqlite的原生语句对于开发者而言有时是一个不幸,在内行应用从前,大家很难保障数据库的说话和履行代码没有其余问题。对此,大家可以在github上边找到基于sqlite3封装的FMDB,它提供了故意的体制来保管数据库访问是线程安全的,至于使用办法在网上一搜一大把课程,那里就不在细说。不过,使用FMDB有一个要专注的题目是——当大家把图片转换成二进制数据存储在数据库中的时候,再一次读取出那些二进制数据初阶化成图片的时候会出荒唐,不能正常转换成图像。解决方案详见那里http://mobile.51cto.com/hot-405287.htm

转发注明链原文地址以及小编

NSString * filePath = [[NSBundle mainBundle] pathForResource:
@”cities” ofType: @”plist”];

上边已经分别介绍了四种方案的利害,在支付中,并没有说哪一类持久化方案是最好的,只可以说在不一致开发情状下,最契合利用的持久化方案。上面大家将用代码实战的章程对这么些持久方案展开更为详实的询问

1、获取plist文件路径:

一、它没有提供数据库的开创格局;

NSString \ documentDirectory =
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) firstObject];*

NSLog(@”执行SQL语句进度爆发错误!”);

网站地图xml地图