目录
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. 网络
- 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);
}];
- 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){
}
}];
- 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.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 读写文件
待续