IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
来源:互联网 发布:红米只能用2g网络 编辑:程序博客网 时间:2024/04/28 04:02
一、文件操作
2、相关方法:
# 使用NSSearchPathForDiretoriesInDomains()方法只能定位Caches目录和Documents目录
NSArray *paths = NSSearchPathForDiretoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)
# NSHomeDirectory();可以取得应用的根目录
e.g 通过home取tmp目录
NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"];
# 使用资源文件:
# 应用安装到设备上后,资源文件是在app(即home目录)目录下的
e.g 获取资源文件
NSString *filePath = [[NSBundle mainBundle] pathForResourcce:@"f" ofType:@"txt"];
NSStirng *fileContent = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error nil];
;
* 1、sqlite3 *db,数据库句柄,跟文件句柄FILE很类似
* 2、sqlite3_stmt *stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句
* 3、sqlite3_open() 打开数据库,没有数据库时创建
* 4、sqlite3_exec() 执行非查询的sql语句
* 5、Sqlite3_step() 在调用sqlite3_prepare后,使用这个函数在记录集中移动
* 6、sqlite3_close()关闭数据库
*
* 还有一系列用于从记录集字段中获取数据,e.g
* 1、sqlite3_column_text() 取text类型的数据
* 2、sqlite3_column_blob() 取blob类型数据
* 3、sqlite3_column_int() 取int类型数据
* 数据库操作要添加 libsqlite3.dylib 静态库
* 包含头文件: import "sqlite3.h"
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict; // 解析完一个元素时回调的方法
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persisteneStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
1、因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:
* Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
* tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
* Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下的文件不会在应用退出删除
2、相关方法:
# 使用NSSearchPathForDiretoriesInDomains()方法只能定位Caches目录和Documents目录
NSArray *paths = NSSearchPathForDiretoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)
# NSHomeDirectory();可以取得应用的根目录
e.g 通过home取tmp目录
NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"];
# 使用资源文件:
# 应用安装到设备上后,资源文件是在app(即home目录)目录下的
e.g 获取资源文件
NSString *filePath = [[NSBundle mainBundle] pathForResourcce:@"f" ofType:@"txt"];
NSStirng *fileContent = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error nil];
# 写入文件:
}
二、sqlite
/* sqlite的方法* 1、sqlite3 *db,数据库句柄,跟文件句柄FILE很类似
* 2、sqlite3_stmt *stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句
* 3、sqlite3_open() 打开数据库,没有数据库时创建
* 4、sqlite3_exec() 执行非查询的sql语句
* 5、Sqlite3_step() 在调用sqlite3_prepare后,使用这个函数在记录集中移动
* 6、sqlite3_close()关闭数据库
*
* 还有一系列用于从记录集字段中获取数据,e.g
* 1、sqlite3_column_text() 取text类型的数据
* 2、sqlite3_column_blob() 取blob类型数据
* 3、sqlite3_column_int() 取int类型数据
* 数据库操作要添加 libsqlite3.dylib 静态库
* 包含头文件: import "sqlite3.h"
*/
三、xml
xml解析:采用系统自带的NSXMLParser进行xml文件的解析,解析是同步的,所以要放到dispatch_async()中进行异步处理,解析类实现NSXMLParserDelegate代理,解析完成后会调相应的代理方法。
简单介绍几个方法:
// 开始解析某个元素时调用的方法- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
用attributeDict的valueForKey方法可以得到相应属性的值
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
// 解析到元素之间的字符串时调用的方法 e.g <name>wusj</name> --->wusj
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;xml解析主要是代理,会代理设计模式,跟android中的xml解析就一样,没有太大区别。如果不理解,应该先看下代理设计模式,能看到这,代理设计模式应该已经很熟悉了。
四、JSONKit解析json文件
JSONKit库是一个第三方的json解析库,ios5之前iOS并没有自带的json解析类库,ios5后有了自己的json解析类库,而且解析效率好。所以如果
只要兼容到ios5应该用系统自带的json解析,如果要支持ios4,则可以用JSONKit,JSONKit效率高,还可以兼容ios4,是一个不错的选择。(跟android的一比,这封装啥都不用干就帮你搞好了,唉)
开源Github地址:https://github.com/johnezang/JSONKit
下载后,将JSONKit.h和JSONKit.m文件拷贝到工程中,使用的时候导入头文件 #import "JSONKit.h" 即可
示例如下:
/* { "aps": { "alert" : { "body" : "a msg come!" }, "bage": 3, "sound" : "def.mp3" } } */ NSString *strJson = @"{\"aps\":{\"alert\":{\"body\":\"a msg come!\"}, \"bage\":3, \"sound\":\"def.mp3\"}}"; // result中即为解析出来的json文件,通过valueForKey即可读到相应的数据 NSDictionary *result = [strJson objectFromJSONString]; NSLog(@"%@", result); NSString *myJsonPath = [[NSBundlemainBundle] pathForResource:@"my"ofType:@"json"]; NSString *myJsonStr = [NSStringstringWithContentsOfFile:myJsonPath encoding:NSUTF8StringEncodingerror:nil]; NSLog(@"myJsonStr : %@", myJsonStr); NSDictionary *myResult = [myJsonStr objectFromJSONString]; NSLog(@"myJson : %@", myResult); // 生成json文件 NSMutableDictionary *jsonDic = [[NSMutableDictionarydictionary] autorelease]; NSMutableDictionary *alert = [[NSMutableDictionarydictionary] autorelease]; NSMutableDictionary *aps = [[NSMutableDictionarydictionary] autorelease]; [alert setObject:@"a msg come!"forKey:@"body"]; [aps setObject:alert forKey:@"alert"]; [aps setObject:@"3"forKey:@"bage"]; [aps setObject:@"def.mp3"forKey:@"sound"]; [jsonDic setObject:aps forKey:@"aps"]; NSString *jsonStr = [jsonDic JSONString];
五、CoreData
刚接触ios不久,对CoreData不熟悉,第一次GOOGLE学习CoreData结果如下,说实话还是有好多不明白的地方,等以后慢慢了解吧。。
在现有的工程中加入CoreData支持
1、在new file中建一个Data Model
选中列表中新建的Data model点击下方的Add Entity新建一个实体,选中实体给实体添加相应的Attributes
给实体生成对应的oc类:选中实体,点击Editor菜单 ----》Create NSManagedObject Subclass即生成了相应的实体类
2、在AppDelegate.h中加入
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persisteneStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
3、在AppDelegate.m中加入
-(void)saveContext{ NSError *error = nil; NSManagedObjectContext *managedObjectContext = self.managedObjectContext; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } }}#pragma mark - Core Data stack- (NSManagedObjectContext *)managedObjectContext{ if (__managedObjectContext != nil) { return__managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [selfpersisteneStoreCoordinator]; if (coordinator != nil) { __managedObjectContext = [[NSManagedObjectContextalloc] init]; [__managedObjectContextsetPersistentStoreCoordinator:coordinator]; } return__managedObjectContext;}- (NSManagedObjectModel *)managedObjectModel{ if (__managedObjectModel != nil) { return__managedObjectModel; } // 这里URLForResource:@"lich" 的名字(lich)要和你建立datamodel时候取的名字是一样的 NSURL *modelURL = //[NSURL fileURLWithPath:[@"lich" stringByAppendingPathExtension:@"mom"]]; [[NSBundlemainBundle] URLForResource:@"lich"withExtension:@"momd"]; __managedObjectModel = [[NSManagedObjectModelalloc] initWithContentsOfURL:modelURL]; return__managedObjectModel;}- (NSPersistentStoreCoordinator *)persisteneStoreCoordinator{ if (__persistentStoreCoordinator != nil) { return__persistentStoreCoordinator; } NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSURL *storURL = [NSURLfileURLWithPath:[docs stringByAppendingPathComponent:@"lich.sqlite"]]; // 这个lich.sqlite名字无限制,就是一个数据库文件的名字// NSURL *storeNRL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"lich.sqlite"];// NSLog(@"storURL : %@", storeNRL);// NSLog(@"store : %@", storURL); NSError *error = nil; __persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:[selfmanagedObjectModel]]; if (![__persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storURL options:nilerror:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return__persistentStoreCoordinator;}- (void)applicationWillTerminate:(UIApplication *)application{ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. [selfsaveContext];}
4、在程序中使用
// 按保存按钮,保存数据- (void)addButtonPressed{ [self.titleFieldresignFirstResponder]; [self.ageFieldresignFirstResponder]; Entity *entity = (Entity *) [NSEntityDescriptioninsertNewObjectForEntityForName:@"Entity"inManagedObjectContext:self.context]; [entity setTitle:self.titleField.text]; [entity setAge:[NSNumbernumberWithInt:[self.ageField.textintValue]]]; NSError *error; BOOL isSaveSuccess = [self.contextsave:&error]; if (isSaveSuccess) { NSLog(@"save successful!"); } else { NSLog(@"Error : %@, %@ ", error, [error userInfo]); }}
// 按查找按钮,取出数据- (void)queryButtonPressed{ // 创建取回数据请求 NSFetchRequest *request = [[[NSFetchRequestalloc] init] autorelease]; // 设置要检索的数据类型 NSEntityDescription *des = [NSEntityDescriptionentityForName:@"Entity"inManagedObjectContext:self.context]; // 设置请求实体 [request setEntity:des]; // 指定结果的排序方式 NSSortDescriptor *sortDescriptor = [[[NSSortDescriptoralloc] initWithKey:@"age"ascending:NO] autorelease]; NSArray *sortDescriptions = [[[NSArrayalloc] initWithObjects:sortDescriptor, nil] autorelease]; [request setSortDescriptors:sortDescriptions]; NSError *error = nil; NSMutableArray *mutableFetchResult = [[self.contextexecuteFetchRequest:request error:&error] mutableCopy]; if (mutableFetchResult == nil) { NSLog(@"Error : %@ , %@", error, [error userInfo]); } self.entities = mutableFetchResult; NSLog(@"The count of entry: %d", [self.entitiescount]); for (Entity *entity inself.entities) { NSLog(@"Title : %@ --------- Age: %d", entity.title, [entity.ageintValue]); } [mutableFetchResult release];}
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
- iOS XML JSON SQLite CoreData 数据持久化
- iOS 数据持久化-CoreData
- iOS 数据持久化 CoreData
- iOS-初级数据持久化
- iOS 初级数据持久化
- ios 数据持久化初级
- iOS-初级数据持久化
- ioS学习笔记—— 数据持久化(Sqlite)
- iOS 通过CoreData实现数据持久化
- iOS ---- 高级数据持久化CoreData
- iOS 通过CoreData实现数据持久化
- iOS 通过CoreData实现数据持久化
- iOS开发 - CoreData框架 数据持久化
- iOS开发 - CoreData框架 数据持久化
- iOS开发数据持久化之-CoreData
- IOS CoreData持久化
- ios 数据持久化之magical record(基于coredata)
- 15,1
- 导出数据为excel表格
- Andorid APK反逆向解决方案---梆梆加固原理探寻
- hadoop深入研究:(一)——hdfs介绍
- 自定义dialog和截屏
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
- 常量字符串
- hive 优化总结 持续更新
- linux软件源码编译一般流程(linux软件安装)
- S5PV210的LED应用(一)
- 文件夹监控 SkinMagic 换肤
- iOS6,iOS5内存警告的兼容处理
- MySQL存储过程之事务管理
- [反思]关于WD李总裁的一次培训内容思考和总结