0
点赞
收藏
分享

微信扫一扫

IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)


​​IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)​​


​​iOS​​​​XML​​​​JSON​​​​SQLite​​​​CoreData​​

一、文件操作

     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];


       # 写入文件:


         ;IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_sqlite

    }


二、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"

      */

      

            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_iOS 网络_02      


            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_sqlite_03    


            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_ios_04


            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_ios_05


三、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" 即可

          示例如下:

[cpp] ​​view plain​​​​copy​

/*
{
"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中加入

[cpp] ​​view plain​​​​copy​

-(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、在程序中使用


            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_json_06



[cpp] ​​view plain​​​​copy​​

// 按保存按钮,保存数据
- (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]);
}
}


[cpp] ​​view plain​​​​copy​​

// 按查找按钮,取出数据
- (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];
}


举报

相关推荐

0 条评论