ios学习笔记 (4)数据持久化

iphone提供的的数据持久化的方法大体上有下面几种:

   1、属性列表

    2、对象归档

    3、SQLite3

    4、Core Data

    5、其它方式:存储文件的方式等

详细介绍请参见具体代码和注释

    转载请注名出处:http://write.blog.csdn.net/postedit/7718672

一、属性类表

/*

属性列表

NSUserDefaults类的使用和NSkeyedArchiver有很多相似之处,但是查看NSUserDefaults的定义可以看出,

NSUserDefaults直接继承自NSObjectNSKeyedArchiver继承自NSCoder.这意味着NSKeyedArchiver实际上

是个归档类持久化的类,也就是可以使用NSCoder类的[encodeObject:(id)objv forKey:(NSString *)key]

方法来数据进行持久存储。

*/

-(void) forNSuserDefaults{

NSString *strOne=@"Persistent data1";

NSString *strTwo=@"Persistent data2";

NSMutableArray *persistentArray=[[NSMutableArrayalloc]init];

[persistentArrayaddObject:strOne];

[persistentArrayaddObject:strTwo];

// archive存储数据

NSUserDefaults *persistentDefaults=[NSUserDefaultsstandardUserDefaults];

[persistentDefaultssetObject:persistentArrayforKey:@"myDefault"];

NSString *descriptionDefault=[persistentDefaultsdescription];

NSLog(@"NSUserDefaults description is %@",descriptionDefault);

[persistentDefaultsrelease];

[persistentArrayrelease];

}

-(void) forNSuserUndefaults{

// unarchive取数据

NSUserDefaults *persistentDefaults=[NSUserDefaultsstandardUserDefaults];

NSArray *UnpersistentArray=[persistentDefaultsobjectForKey:@"myDefault"];

NSString *UnstrOne=[UnpersistentArrayobjectAtIndex:0];

NSString *UnstrTwo=[UnpersistentArrayobjectAtIndex:1];

NSLog(@"UnstrOne= %@,UnstrTwo= %@",UnstrOne,UnstrTwo);

[UnpersistentArrayrelease];

[persistentDefaultsrelease];

}


二 、对象归档

/*

对象归档NSKeyedArchiver NSKeyedUnarchiver

这种方式有点类似于Android中的SharePreference方式的存储,作用范围在整个项目中,只有根据myFilename都是可以取到的。

iphone symbian 3rd一样,会为每个应用程序生成一个私有的目录,这个目录位于

User/sundfsun2009/Library/Application Support/iphone Simulator/User/Application下,并随即生成一个数字字母串作为目录名,在每一次启

动应用程序时,这个字母数字串都是不同与上一次的,上一次的应用程序目录信息被转换成名为:.DS_Store隐藏文件

通常使用Documents目录进行数据持久化的保存,而这个Documents目录可以通过NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserdomainMask,YES)得到

*/

-(void) forNSKeyedArchiver{

//第一步:定义并初始化一个数组即被保存的数据。

NSString *strOne=@"Persistent data1";

NSString  *strTwo=@"Persistent data2";

NSArray *persistentArray=[NSArrayarrayWithObjects:strOne,strTwo,nil];

//第二步:生成 .rtf完整的文件路径名

NSArray *pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSAllDomainsMask,YES);//第二个参数是个枚举值  NSUserDomainMaskNSAllDomainsMask可以获取到目录数为1,其余的皆为0

int pathLen=[pathArraycount];

NSLog(@"path number is %d",pathLen);//1

NSString *filePath;

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

filePath=[pathArrayobjectAtIndex:i];

NSLog(@"%d path is :%d",i,filePath);//这里输出: 0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents

}

NSString *myFilename=[filePathstringByAppendingPathComponent:@"myFile.rtf"];//上面的路径PATH/myFile.rtf

NSLog(@"myfile\'s path is : %@",myFilename);

//第三步保存数组数据到myFile.rtf中去,这里的myFilename是路径+文件名

[NSKeyedArchiverarchiveRootObject:persistentArraytoFile:myFilename];//把这个数组添加到myFile.rtf中去

//总结:每次应用程序启动时生成的数字字母串目录名字并不一样。

//在调用[NSKeyedArchiver archiveRootObject:persistentArray toFile:myFilename]方法前,文件myFile.rtf并每生成,

//只有在调用此方法后才产生相应的文件。

}


/*

演示的取数据的操作

*/ 

-(void) forNSKeyedUnarchiver{

NSArray *pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSAllDomainsMask,YES);//第二个参数是个枚举值  NSUserDomainMaskNSAllDomainsMask可以获取到目录数为1,其余的皆为0

int pathLen=[pathArraycount];

NSLog(@"path number is %d",pathLen);//1

NSString *filePath;

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

filePath=[pathArrayobjectAtIndex:i];

NSLog(@"%d path is :%d",i,filePath);//0 path is :/Users/sundfsun2009/Library/Application Support/iPhone Simulator/User/Applications/C93DC783-F137-4660-AE5A-08C3E11C774B/Documents

}

NSString *myFilename=[filePathstringByAppendingPathComponent:@"myFile.rtf"];//上面的路径PATH/myFile.rtf

NSLog(@"myfile\'s path is : %@",myFilename);

//第三步保存数组数据到myFile.rtf中去,这里的myFilename是路径+文件名

//[NSKeyedArchiver archiveRootObject:persistentArray toFile:myFilename];//把这个数组添加到myFile.rtf中去

NSArray *unarchiveArray = [NSKeyedUnarchiverunarchiveObjectWithFile:myFilename];

NSString *UnstrOne = [unarchiveArrayobjectAtIndex:0];

NSString *UnstrTwo = [unarchiveArrayobjectAtIndex:1];

NSLog(@"UnstrOne = %@,UnstrTwo = %@",UnstrOne,UnstrTwo);

}


三、 SQLite3 嵌入式数据库

  关于sqlite3数据库在iphone项目中的应用大体上有下面几个步骤:

   1、 在新建的项目中右击Frameworks文件夹,添加libsqlit3.dylib库;

   2、 在.h的头文件中声明一个类型为sqlite3的变量;// 这里要特别说明一下这个变量,开始的时候是为NULL的,数据库打开之后就不为空了,不知道sqlite3中对这中结构的设计是出于什么目的,暂且记住这么用吧,如何你对它有更好的理解不妨告诉我一下。

         sqlite3 *_database;

   3、 获取Documents文件夹的路径,这个其实就是数据库文件最终存在的目录,新建时也要建在这目录下;

   

- (NSString *)getDocuments{

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString *documentsDirectory = [pathsobjectAtIndex:0];

return [documentsDirectorystringByAppendingPathComponent:kFilename];// 这个kFilename 是你为数据库起的名字

}

   4、 创建并打开数据库

/*

如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)

打开数据库,这里的[path UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是

Objective-C)编写的,它不知道什么是NSString.

*/

- (void)openDB {

//获取数据库路径

NSString *path = [selfgetDocuments];

if(sqlite3_open([pathUTF8String], &_database) !=SQLITE_OK) {

//如果打开数据库失败则关闭数据库

sqlite3_close(self._database);

}

}

  5、创建表

//创建表

- (BOOL) createTableMath:(sqlite3*)db {

//这句是大家熟悉的SQL语句

char *sql ="create table if not exists testTable(ID INTEGER PRIMARY KEY AUTOINCREMENT, testID int,testValue text)";

sqlite3_stmt *statement;

//sqlite3_prepare_v2接口把一条SQL语句解析到statement结构里去.使用该接口访问数据库是当前比较好的的一种方法

//第三个参数我写的是-1,这个参数含义是前面 sql 语句的长度。如果小于0sqlite会自动计算它的长度(把sql语句当成以\0结尾的字符串)。

//第四个参数是sqlite3_stmt 的指针的指针。解析以后的sql语句就放在这个结构里。

//第五个参数为nil就可以了。

//如果这个函数执行成功(返回值是 SQLITE_OK statement 不为NULL ),那么下面就可以开始插入二进制数据。

//如果SQL语句解析出错的话程序返回

NSInteger sqlReturn =sqlite3_prepare_v2(_database, sql, -1, &statement,nil);

if(sqlReturn !=SQLITE_OK) {

NSLog(@"Error: failed to prepare statement:create test table");

returnNO;

}

NSLog(@"..create test table successful..>>");

//执行statement语句

int success =sqlite3_step(statement);

//释放sqlite3_stmt

sqlite3_finalize(statement);

//执行SQL语句失败

if ( success !=SQLITE_DONE) {

NSLog(@"Error: failed to dehydrate:create table test");

returnNO;

}

NSLog(@"Create table 'testTable' successed.");

returnYES;

}



  6、 插入数据

//  插入数据 方式一

-(BOOL)insertRecord1{

if ([selfopenDB]) {

sqlite3_stmt *statement;

staticchar *sql="insert into testTable(testID,testValue) values(?,?);";// ?表示未定的值,它的值等下才会插入

int success2=sqlite3_prepare_v2(_database, sql, -1, &statement, NULL);

if (success2!=SQLITE_OK) {

sqlite3_close(_database);

returnNO

}

//这里的12代表第几个问号

sqlite3_bind_int(statement,1, @"1");

sqlite3_bind_text(statement,2, @"test value", -1,SQLITE_TRANSIENT);

success2=sqlite3_step(statement);

sqlite3_finalize(statement);

if (success2!=SQLITE_OK) {

sqlite3_close(_database);

returnNO;

}

sqlite3_close(_database);

returnYES;

}

returnNO;

}


大多数情况下推荐这种方式 比较简洁

插入数据方式 二

-(void) insertRecord2:(NSString *)tableName withField1:(NSString*) field1 field1Value:(NSString*) field1Value withField2:(NSString*)field2 field2Value:(NSString*) field2Value{

NSString *sql=[NSString stringWithFormat:@"insert or replace into '%@' ('%@' ,'%@') values ('%@','%@')",tableName,field1,field1Value,field2,field2Value];

char *err;

if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err)!=SQLITE_OK) {

sqlite3_close(db);

NSAssert(0,"插入记录失败");

}


}

 


  7、 遍历数据

// 查询记录

-(NSMutableArray*)getResult:(int)searchID{

NSMutableArray *array=[NSMutableArrayarrayWithArray:10];

if ([selfopenDB]) {

sqlite3_stmt *statement=nil;

char *sql="select testID,testValue from testTable where testID=?";

if (sqlite3_prepare_v2(_database, sql, -1, &statement, NULL)!=SQLITE_OK) {

returnNO;

}else {

sqlite3_bind_int(statement,1, searchID);// 这里的1是代表的sql语句里面的那个问号

while (sqlite3_step(statement)==SQLITE_ROW) {// 便利结果集,这都是sqlite3自己的方法。

sqlTestList* sqlList=[[sqlTestList alloc ]init];

sqlList.sqlID=sqlite3_column_int(statement,0);//取出相应字段的值,数据库中也是integer类型

char *strText=(char*)sqlite3_column_text(statement,1);//这里要转换一下格式

sqlList.sqlText=[NSStringstringWithUTF8String:strText];

[arrayaddObject:sqlList];

[sqlListrelease];

}

}

sqlite3_finalize(statement);

sqlite3_close(_database);


}

return [arrayretain];

}



关于Core Data的用法另起一篇吧,文章太长了自己看着都有点不耐烦了!!

转载请注名出处:http://write.blog.csdn.net/postedit/7718672

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
iOS中的MMKV是一个高性能、轻量级的键值存储库,可以用于持久化数据。它由微信团队开发,通过使用C++编写的底层存储引擎,提供了比NSUserDefaults更快速和可靠的存储解决方案。 要在iOS中使用MMKV进行持久化,你可以按照以下步骤进行操作: 1. 集成MMKV库:首先,需要将MMKV库添加到你的iOS项目中。你可以通过CocoaPods或手动导入方式添加依赖。具体的集成步骤可以参考MMKV的官方文档。 2. 创建MMKV实例:在使用MMKV之前,你需要创建一个MMKV实例来操作数据。可以使用下面的代码创建一个MMKV实例: ``` // 导入MMKV头文件 #import <MMKV/MMKV.h> // 创建MMKV实例 NSString *mmkvID = @"your_mmkv_id"; MMKV *mmkv = [MMKV mmkvWithID:mmkvID]; ``` 在创建MMKV实例时,需要指定一个唯一的ID来区分不同的实例。这个ID会被用作数据存储的文件名。 3. 存储数据:使用MMKV实例可以方便地存储各种类型的数据。例如,存储字符串可以使用以下代码: ``` NSString *key = @"your_key"; NSString *value = @"your_value"; [mmkv setString:value forKey:key]; ``` 除了字符串外,MMKV还支持存储其他基本数据类型(如整数、布尔值等),以及NSData对象。 4. 读取数据:使用MMKV实例可以快速读取存储的数据。以下是一个读取字符串数据的示例: ``` NSString *key = @"your_key"; NSString *value = [mmkv getStringForKey:key]; ``` 同样地,你也可以使用适当的方法来读取其他类型的数据。 通过这些简单的步骤,你可以在iOS应用中使用MMKV库进行持久化操作。希望这能对你有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值