iOS基础之 网络请求+模型转换+持久化

目录
    1. 网络
       1. AFN框架
       2. NSURLSession
       3. NSURLConnection 
       4. 其他
    2. 模型转换
       2.1 JSONModel
       2.2 MJExtension
    3. 存储
       3.1 NSUserDefaults
       3.2 NSCoding
       3.3 sqlite
       3.4 FMDB
       3.5 CoreData
       3.6 读写文件
1. 网络
  1. AFN框架(第三方网络请求---常用)
    // 1.创建网络请求manager
    AFHTTPSessionManager *manger=[AFHTTPSessionManager manager];
    // 1.1 设置请求的数据类型
    // 设置 request类型为二进制类型(默认)
    [manger setRequestSerializer:[AFHTTPRequestSerializer serializer]];
    // 设置 请求超时时间
    [manger.requestSerializer setTimeoutInterval:6.f];
    // 1.2 设置 response
    // 设置 response类型为二进制类型(默认:JSON类型,已经解析)
    [manger setResponseSerializer:[AFHTTPResponseSerializer serializer]];
    // 设置 允许接收的数据类型
    [manger.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json",@"text/json", @"text/javascript",@"text/html", nil]];
    
    // 2.发送请求
    // url
    NSString *urlStr=@"url";
    // 参数(可以是数组/字典/nil)
    NSDictionary *paraDic=@{@"userId":@""};
    [manger POST:urlStr parameters:paraDic progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 主线程:可以直接更新UI
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@发生错误: \n%@",urlStr,error);
    }];


'
     请求格式
        AFHTTPRequestSerializer            二进制格式        (默认)
        AFJSONRequestSerializer            JSON
        AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)
     返回格式
        AFHTTPResponseSerializer           二进制格式  (不作任何处理:NSData,当返回的数据不是JSON/XML/plist/image要设置,如:HTML、Text)
        AFJSONResponseSerializer           JSON            (默认)
        AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析
        AFXMLDocumentResponseSerializer (Mac OS X)
        AFPropertyListResponseSerializer   PList
        AFImageResponseSerializer          Image
        AFCompoundResponseSerializer       组合
'
上传
    // url
    NSString *urlStr=@"url";
    // 参数(可以是数组/字典/nil)
    NSDictionary *paraDic=@{@"userId":@""};
    [manger POST:urlStr parameters:paraDic constructingBodyWithBlock:^(id  _Nonnull formData) {
        // img->data
        NSData *imgData=UIImagePNGRepresentation([UIImage imageNamed:@""]);
        
        // 设置需要上传的文件(需要上传的文件,后台规定的参数名,文件名,后台规定的文件类型)
        [formData appendPartWithFileData:imgData name:@"headImage" fileName:@"hello.png" mimeType:@"image/png"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 上传成功
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@发生错误: \n%@",urlStr,error);
    }];
  1. NSURLSession (原生网络请求类---目前用)
    // 1.创建请求
    NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"urlStr"]];
    // 2.创建会话
    NSURLSession *session=[NSURLSession sharedSession];
    // 3.创建任务
    NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(error==nil){
            NSDictionary *dcit=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
            // 刷新UI在主线程中
        }
    }];
    // 3.1启动任务
    [task resume];
继承关系:
  NSObject
      NSURLSessionTask
          NSURLSessionDataTask         NSURLSessionDownloadTask
            NSURLSessionUploadTask

说明:
    NSURLSessionUploadTask          上传专用Task(不接收数据)
    NSURLSessionDownloadTask        下载专用Task
    NSURLSessionDataTask            上传数据,并接收返回数据
0.创建NSURLRequest (3方式)
方式一
    NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@""]];

方式二    
    NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@""] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2];

方式三
    NSMutableURLRequest *muRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@""]];
    // 设置请求超时时间
    [muRequest setTimeoutInterval:10];  
    // 默认GET,设置请求方式
    [muRequest setHTTPMethod:@"POST"]; 
    // 设置请求体
    [muRequest setHTTPBody:[@"key=value&key2=value2" dataUsingEncoding:NSUTF8StringEncoding]];  
    // 设置请求头
    [muRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [muRequest addValue:@"" forHTTPHeaderField:@"Content-Length"];  



1. 创建NSURLSession(3方式)
方式一    全局Session(有局限)
    NSURLSession *session=[NSURLSession sharedSession];

方式二    SessionConfiguration
    NSURLSessionConfiguration *connfi=[NSURLSessionConfiguration defaultSessionConfiguration];
    [connfi setTimeoutIntervalForRequest:5];        // 设置请求超时
    NSURLSession *session=[NSURLSession sessionWithConfiguration:connfi];
    NSURLSession *session=[NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    后台Session
    NSURLSessionConfiguration *config=[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@""];
    NSURLSession *session=[NSURLSession sessionWithConfiguration:connfi];



2. 创建NSURLSessionConfiguration (3方式)
  方式一
    // 存储Cache在硬盘(默认模式,保存用户的证书到钥匙串,使用共享cookie存储)
    NSURLSessionConfiguration *config=[NSURLSessionConfiguration defaultSessionConfiguration];

  方式二
    // 存储Cache在内存(用于无痕浏览,会话结束后清空数据)
    NSURLSessionConfiguration *config=[NSURLSessionConfiguration ephemeralSessionConfiguration];

  方式三    
    // 将上传下载移到后台
    NSURLSessionConfiguration *config=[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@""];
3. 创建NSURLSessionDataTask (4方式)
方式一
    NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];
方式二
    NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
方式三
    NSURLSessionDataTask *dataTask=[session dataTaskWithURL:[NSURL URLWithString:@""]];
方式四
    NSURLSessionDataTask *dataTask=[session dataTaskWithURL:[NSURL URLWithString:@""] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
    [dataTask resume];  // 任务开始
    [dataTask suspend]; // 任务暂停
    [dataTask cancel];  // 任务取消



4. 创建NSURLSessionUploadTask(5方式)     上传data
方式一
    [session uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] fromData:data];
方式二
    [session uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
方式三
    [session uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] fromFile:[[NSURL alloc]initFileURLWithPath:[NSString stringWithFormat:@"%@/Documents/1.txt",NSHomeDirectory()]]];
方式四
    [session uploadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] fromFile:[[NSURL alloc]initFileURLWithPath:[NSString stringWithFormat:@"%@/Documents/1.txt",NSHomeDirectory()]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
方式五
[session uploadTaskWithStreamedRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];



2. 创建NSURLSessionDownloadTask(6方式)下载data
方式一
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithURL:[NSURL URLWithString:@""]];
方式二
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithURL:[NSURL URLWithString:@""] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
方式三
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];
方式四
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
方式五
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithResumeData:data];
方式六
    NSURLSessionDownloadTask *dataTask=[session downloadTaskWithResumeData:data completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(!error){
        }
    }];
  1. NSURLConnection(原生网络请求类---已过时)
方式一:使用dele(异步)

@property (nonatomic,strong) NSMutableData *contentData;

    // 1.创建请求,建立连接
    NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"urlStr"]];
    NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];

#pragma mark dele
// 2.收到响应时调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    _contentData.length=0;
}
// 3.收到数据时调用
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [_contentData appendData:data];
}
// 4.数据接收完毕后调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{}
// 4.1连接出错时调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{}
方式二:sendAsynchronousRequest(异步)
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"urlStr"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    }];
方式三:sendSynchronousRequest(同步)
    NSData *contentData=[NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"urlStr"]] returningResponse:&response error:nil];
  1. 其他
注意:

  1.App如果需要进行网络操作,则要在info.plist文件中添加权限:

        NSAppTransportSecurity
        
            NSAllowsArbitraryLoads
            
        
菊花
    // 是否打开菊花(状态栏上:用来提示用户正在请求网络)
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:true];
data<->str
    // data->str
    NSString *str=[[NSString alloc]initWithData:[NSData new] encoding:NSUTF8StringEncoding];
    // str->data
    NSData *data=[@"" dataUsingEncoding:NSUTF8StringEncoding];
中文
    对中文编码(url中有中文)
    string.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLFragmentAllowedCharacterSet())! 
    对中文解码       
    paraStr.stringByRemovingPercentEncoding
Charles(抓包)
    1. 下载charles
    2. 连上同一Wifi,手机设置wifi为手动:服务器(mac终端:ifconfig en0 找到地址) 端口:8888(默认:charles的Proxy中设置的)
    3. OK

XML(过时, 现只用于存储,不用于传输)

用来存储和传递数据(优点:可读性强,缺点:太冗余)
    文档由节点(开始标签和结束标签组成)构成


例:

                             根节点
                       id是属性节点
        book1          name是元素节点
        12
    




使用(2方式):
—————————方式一
第一步:
    1. 导入Data文件,建立桥接文件  :   #import "GDataXMLNode.h"
    2. Build Phase  |  Link Binary With Libraries  添加libxml2.tbd
    3. Build Phase  |  Compile Source   .m文件后双击 +  -fno-objc-arc
    4. BuildSettings | header Search Path  +  /usr/include/libxml2
第二步:
        let path=NSBundle.mainBundle().pathForResource("xml", ofType: "txt")
        let data=NSData.init(contentsOfFile: path!)
        let doc=try! GDataXMLDocument.init(data: data, options: 0)      // 解析数据
        
        let rootE=doc.rootElement()     // 获取根节点
        print(rootE.XMLString())        // 打印节点
        
        // 获取节点的内容(根据节点名)
        let booksArr=rootE.elementsForName("books") as! [GDataXMLElement]       // 获取元素节点(返回数组)
        let booksEl=booksArr[0]
        
        let bookArr=booksEl.elementsForName("book") as! [GDataXMLElement]
        for bookEl in bookArr{
            let name=(bookEl.elementsForName("name")[0]) as! GDataXMLElement    // 
            let attName=bookEl.attributes()[0] as! GDataXMLNode                 // 获取属性节点(返回数组)
            print(name.stringValue())                                           // 节点值      name.name()节点名
        }
—————————方式二
    XPath 使用路径表达式获取节点
    /   从根节点获取
    //  查询和名称相同的节点(不考虑位置)
    .   获取当前节点
    ..  获取当前节点的父节点
    @   获取属性

        // 位置
        let pathT="/root/books/book/name"
        // 查询所有 符合pathT位置 的节点
        let nameArr=try! doc.nodesForXPath(pathT)
        print(nameArr[0].stringValue())

扩展:
            根名             获取 根名 元素的所有子节点
            /根名            获取 根名 元素的所有子节点
            /根名/元素名      获取 和路径匹配的所有元素节点
            //元素名                获取 元素名相同的所有元素节点
            根名/元素名//元素名      获取 元素名相同的所有元素节点(在根名/元素名 下)
            //@属性名        获取 属性名相同 的所有元素节点


            /根名/元素名[1]  获取第一个满足path的元素节点
            [last()]         最后一个
            [position()<3]   前2个
            [属性名>3]/元素名

            //title[@length]        或取所有 属性名length的元素名title 的元素
            //title[@length='e']    或取所有 属性名length且值为e的元素名title 的元素

            *      匹配任何元素节点。
            @*     匹配任何属性节点。
            node()  匹配任何类型的节点。
            |      多个路径

监测网络状态 (需引入AFN框架)

1. cocoaPods
    pod 'AFNetworking'
2.AppDelegate+
#import 

// 监听网络状态
-(void)mangeNet{
    // 1.获取网络管理者
    AFNetworkReachabilityManager *netManger=[AFNetworkReachabilityManager sharedManager];
    // 2.网络状态发生变化后调用
    [netManger setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:{
                // 检测到网络状态前为此状态
                NSLog(@"网络未知");
            }
                break;
            case AFNetworkReachabilityStatusNotReachable:{
                NSLog(@"连接不到网络");
                // 提示用户,跳到系统设置页设置网络
            }
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:{
                NSLog(@"流量");
            }
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:{
                NSLog(@"wifi");
            }
                break;
        }
    }];
    // 3.监测网络变化
    [netManger startMonitoring];
}
    // 获取当前网络状态
    AFNetworkReachabilityStatus status=netManger.networkReachabilityStatus;

    // 跳转到设置---蜂窝网络
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"App-Prefs:root=MOBILE_DATA_SETTINGS_ID"]];
2. 模型转换

2.1 JSONModel

1. cocoaPods引入
# JSONModel
pod 'JSONModel'
2. 自定义模型
#import 
YTPersonModel : JSONModel

// 1.属性是否可选(当有自定义属性不需要转换时+)
+(BOOL)propertyIsOptional:(NSString *)propertyName{
    return true;
}
// 2.当有名字不一样时+ (自定义属性:后台属性)
+(JSONKeyMapper *)keyMapper{
    return [[JSONKeyMapper alloc]initWithModelToJSONDictionary:@{@"themeId":@"id",@"Description":@"description"}];

/*
        // 去掉_a 改为 A    (将驼峰模式改为下划线模式)
        return JSONKeyMapper.mapperFromUnderscoreCaseToCamelCase()
*/
}

// 3.有类属性数组   或  作其他处理 +
-(instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError *__autoreleasing *)err{

    self=[super initWithDictionary:dict error:err];
    if(self){
    
        //
        NSArray *dayNumArr=dict[@"tripDayList"];
        _tripDayList=[YTDayModel arrayOfModelsFromDictionaries:dayNumArr error:nil];
        
        // 
        if(dict[@"readyTime"]){  
            _readyTime=[dict[@"readyTime"] intValue];
        }else if(dict[@"redayTime"]){
            _readyTime=[dict[@"redayTime"] intValue];
        }
    }
    
    return self;
}
3. 使用:
_guideArr=[YTPublishDZModel arrayOfModelsFromDictionaries:gjArr error:nil];

2.2 MJExtension

1.cocoaPods导入
pod 'MJExtension'
2.model

BaseModel.h
#import 
@interface BaseModel : NSObject
// 其他属性(对应)
@property (nonatomic, copy) NSString *ID;
@end


BaseModel.m
#import "BaseModel.h"
@implementation BaseModel

// + description打印所有属性
MJLogAllIvars
// 使该model类实现NSCoding协议,用于归档(必须)
MJCodingImplementation

// 替换不同的字段
+ (NSDictionary *)replacedKeyFromPropertyName{
    
    NSDictionary *dict = @{@"ID": @[@"id",@"houseId"] ,@"descriptions":@"description"};
    return dict;
}
// 把null的字段转换为空字符串
- (id)mj_newValueFromOldValue:(id)oldValue property:(MJProperty *)property{
    
    // 把null属性处理成空字符串
    if ([oldValue isKindOfClass:[NSNull class]]){
        
        if (property.type.isNumberType){
            return 0;
        }else if (property.type.isBoolType){
            return 0;
        }else if ([property.type.code isEqualToString:@"NSArray"]){
            return @[];
        }else{
            return @"";
        }
    }
    if (!oldValue){
        if (property.type.isNumberType){
            return 0;
        }else if (property.type.isBoolType){
            return 0;
        }else if ([property.type.code isEqualToString:@"NSArray"]){
            return @[];
        }else if ([property.type.code isEqualToString:@"NSString"]){
            return @"";
        }else{
            return nil;
        }
    }
    
    return oldValue;
}
@end
3. 使用
NSArray *selecteds = [BaseModel mj_objectArrayWithKeyValuesArray:dic[@"response"][@"selected"]
3. 持久化
    NSUserDefaults 
    NSCoding归档
    sqlite
    FMDB
    CoreData
    读写文件

3.1 NSUserDefaults

    用于存储系统自带类型,  缺点:不能存储自定义类类型。
    // 设值(必须调用synchronize)
    [[NSUserDefaults standardUserDefaults]setObject:@(10) forKey:@"age"];
    [[NSUserDefaults standardUserDefaults]synchronize];
    // 取值
    [[NSUserDefaults standardUserDefaults]objectForKey:@"age"];

其他设值方式(必须调用synchronize)
    [[NSUserDefaults standardUserDefaults]setBool:true forKey:@"sex"];
    [[NSUserDefaults standardUserDefaults]setInteger:10 forKey:@"age"];
    [[NSUserDefaults standardUserDefaults]setDouble:10.0 forKey:@"weight"];
    [[NSUserDefaults standardUserDefaults]setFloat:10.0f forKey:@"weight"];

3.2 NSCoding

    用来存储自定义类类型。
1. 创建归档类(遵守NSCoding协议实现encodeWithCoder、initWithCoder)
Student.h
#import 
@interface Student : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
@end

Student.m
#import "Student.h"
@implementation Student
// 编码
-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}
// 解码
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if(self){
        self.name=[aDecoder decodeObjectForKey:@"name"];
        self.age=(int)[aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
@end

2.归档、解档
    Student *student=[Student new];
    // 路径
    NSString *path=[NSString stringWithFormat:@"%@/Documents/hello.archive",NSHomeDirectory()];
    // 归档
    [NSKeyedArchiver archiveRootObject:student toFile:path];
    // 解档
    student=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

3.3 sqlite

SQLite是一个由C编写的SQL嵌入式轻量级关系型数据库(线程不安全)
DBManger.h

#import 
@interface DBManger : NSObject
+(instancetype)sharedSingleton;
@end
DBManger.m

#import "DBManger.h"
#import 

@interface DBManger()
@end

@implementation DBManger


// ---------- 单例 ---------
static DBManger *_singleton;
+(instancetype)sharedSingleton{
    return [self new];
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    @synchronized (self) {
        if(!_singleton){
            _singleton=[super allocWithZone:zone];
        }
    }
    return _singleton;
}
// 避免使用copy mutableCopy方法时再次创建
-(id)copyWithZone:(NSZone *)zone{
    return _singleton;
}
-(id)mutableCopyWithZone:(NSZone *)zone{
    return _singleton;
}


// ------------ 操作数据库 -----------
static sqlite3 *db = nil;

/*
 打开数据库
 */
-(void)openDB{
    // 有db则打开,没db则先创建再打开
    NSString *path=[NSString stringWithFormat:@"%@/Documents/test.db",NSHomeDirectory()];
    if(sqlite3_open([path UTF8String], &db)==SQLITE_OK){    // 打开db成功
        NSLog(@"数据库打开成功");
    }
}
/*
 关闭数据库
 */
-(void)closeDB{
    if (sqlite3_close(db) == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
        db = nil;
    } else {
        NSLog(@"数据库关闭失败");
    }
}
/*
 创建表
 */
-(void)createTable{
    //
    [self openDB];
    NSString *sql=@"CREATE TABLE IF NOT EXISTS good(good_id INTEGER PRIMARY KEY AUTOINCREMENT,good_name CHAR(50) NOT NULL DEFAULT 'good',good_content CHAR(200),good_pic CHAR(100));";
    char *error;
    if(sqlite3_exec(db,[sql UTF8String], nil, nil, &error)==SQLITE_OK){
        NSLog(@"创建表成功");
    }else{
        NSLog(@"创建表失败 = %s",error);
    }
    [self closeDB];
}
/*
 删除表
 */
-(void)dropTable{
    //
    [self openDB];
    NSString *sql=@"DROP TABLE good;";
    char *error;
    if(sqlite3_exec(db,[sql UTF8String], nil, nil, &error)==SQLITE_OK){
        NSLog(@"创建表成功");
    }else{
        NSLog(@"创建表失败 = %s",error);
    }
    [self closeDB];
}

/*
 更新表
 */
- (void)insertData{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sqlStr = @"INSERT good(good_name,good_content) VALUES(?,?);";
    //        sqlStr="UPDATE TABLE good SET good_name=? WHERE good_id=?"
    //        sqlStr="DELETE FROM good WHERE good_name=?"
    if (sqlite3_prepare_v2(db, sqlStr.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
        // 索引从1开始,代表第几个问号
        sqlite3_bind_int(stmt, 1, 10);
        sqlite3_bind_text(stmt, 2,  sqlStr.UTF8String, -1, SQLITE_TRANSIENT);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"新增成功");
        }
    } else {
        NSLog(@"新增数据不合法");
    }
    sqlite3_finalize(stmt);
    [self closeDB];
}

/*
 查询表
 */
- (void)queryData{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sqlStr = @"SELECT * FROM good";
    if (sqlite3_prepare_v2(db, sqlStr.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
        if (!(sqlite3_step(stmt) == SQLITE_DONE)) {
            // 单步获取每行(SQLITE_ROW为一行数据)
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                int ID = sqlite3_column_int(stmt, 0);
                const unsigned char *name = sqlite3_column_text(stmt, 1);
                const unsigned char *content = sqlite3_column_text(stmt, 2);
                const unsigned char *pic = sqlite3_column_text(stmt, 3);
                NSLog(@"ID = %d , name = %@ , sex = %@, description = %@",ID,[NSString stringWithUTF8String:(const char *)name],[NSString stringWithUTF8String:(const char *)content],[NSString stringWithUTF8String:(const char *)pic]);
            }
        } else {
            NSLog(@"查询语句完成");
        }
    } else {
        NSLog(@"查询语句不合法");
    }
    
    //
    sqlite3_finalize(stmt);
    [self closeDB];
}

@end

3.4 FMDB

3.5 CoreData

3.6 读写文件

待续

你可能感兴趣的:(iOS基础之 网络请求+模型转换+持久化)