1、数组和集合的区别是 集合是无序的
2、数据库不能插入空指针,否则访问数据库时,会出错
3、数据库支持的类型 只能是这三种:NSString NSNumber NSData
4、存储数据的方式:归档 plist UserDefault 数据库 coredata 生成的目录只能存的地方是沙盒
5、数据量特别大 用数据库 很难查看 用数据库语句查看 数据库保存表 稍小一点的用plist 双击就可以查看
6、数据库中自增 类型限制就是只能是整型
7、(服务器端)黄金搭档
MySql + 接口 + php php写服务器的语言+Apache服务器 LAMP平台(免费)
MSSql + .net 语言 + windows + iis 微软全套的
嵌入式设备的数据库 sqlite(3) 轻量级数据库 access(微软的)
sqlite是弱类型 字段处可以不加类型
ls
cd ~/Desktop
sqlite3 data.db
创建表
8、下拉刷新中的上次刷新的时间 存在UserDefault中
9、沙盒 沙盒目录相互独立 不能相互访问 iOS中应用都是沙盒目录
10、 //查询 集合和数组的区别就是 前者无序
FMResultSet * set = [_db executeQuery:@"select * from USER"];//集合
/*
uid name score
1 叶开 99
2 傅红雪 98
*/
while ([set next]) {
//取值
//name
NSString * name = [set stringForColumn:@"name"];//取name字段的值
//int
int score = [set intForColumn:@"score"];
//data
//NSData * data = [set dataForColumn:@"image"];
//一般我们会创建一个person的对象将数据存到对象中
//[set objectForColumnIndex:@"score"];这种方法可以获取各种类型的数据 但是取出之后要转化为自己想要的类型
//int double都有自己的方法 但float只能使用这个方法
NSLog(@"%@,%d",name,score);
}
11、数据库主键 唯一键
区别:唯一键可以有多个 唯一键可以为空 主键只有一个主键不能为空
相同点:都不可以重复
1、UIImagePickerController 图片选择器
需要UIImagePickerContrllerDelegate 和 UInavigationControllerDelegate 这两个代理
2、UIImagePickerController的对象ipc
ipc.sourceType 数据源 有三个UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
3、UIImagePickerContrllerDelegate 需要实现三个方法
选择照片-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
_imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];//拿到照片 然后dismiss
[picker dismissViewControllerAnimated:YES completion:nil];
}
取消选择
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];//取消选择 就dismiss
}
4、将图片转换为NSData类型
NSData * data = UIImagePNGRepresenttation(——imageView.image);向数据库里面存图片不好 可以将图片存到沙盒中 然后将路径存到数据库里
FMDB数据库第三方库
UIActionSheetDelegate
UIImagePickerControllerDelegate
UINavigationControllerDelegate
UIWebViewDelegate 都是系统自己自带的
request.URL.absoluteString webView中请求的地址
ASIHTTPRequest 是数据请求的第三方库 是极其强劲的HTTP访问开源项目 AFNetWorking 必须在ARC下
使用ASIHTTPRequest可以很方便的进行一下操作:同步/异步方式下载数据,定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须 是异步的),提交表单,文件上传,处理cookie,设置代理,上下载进度条,重定向处理,请求与响应的GZIP,验证与授权。
异步请求
- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}
使用block
在平台支持下,ASIHTTPRequest1.8以上支持block
- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCompletionBlock:^{
// Use when fetching text data
NSString *responseString = [request responseString];
// Use when fetching binary data
NSData *responseData = [request responseData];
}];
[request setFailedBlock:^{
NSError *error = [request error];
}];
[request startAsynchronous];
}
声明request时要使用__block修饰符,这是为了告诉block不要retain request,以免出现retain循环,因为request是会retain block的。
使用队列
创建NSOperationQueue或者ASINetworkQueue队列,我们还可以设定最大并发连接数:maxConcurrentOperationCount
1. - (IBAction)grabURLInTheBackground:(id)sender
2. {
3. if (![self queue]) {
4. [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
5. [self queue].maxConcurrentOperationCount = 4;
6. }
7.
8. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
9. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
10. [request setDelegate:self];
11. [request setDidFinishSelector:@selector(requestDone:)];
12. [request setDidFailSelector:@selector(requestWentWrong:)];
13. [[self queue] addOperation:request]; //queue is an NSOperationQueue
14. }
15.
16. - (void)requestDone:(ASIHTTPRequest *)request
17. {
18. NSString *response = [request responseString];
19. }
20.
21. - (void)requestWentWrong:(ASIHTTPRequest *)request
22. {
23. NSError *error = [request error];
24. }
如果不设定selector,那么系统会使用默认的requestFinished: 和 requestFailed:方法
如果需要对队列里面的每个request进行区分,那么可以设定request的userInfo属性,它是个NSDictionary,或者更简单的方法是设定每个request的tag属性,这两个属性都不会被发送到服务器。
不要使用request的URL来区分每个request,因为URL可能会改变(例如重定向),如果需要使用request的URL,使用[request originalURL],这个将永远返回第一个url。
对于ASINetworkQueue
ASINetworkQueue是NSOperationQueue的子类,提供更高级的特性(ASINetworkQueue的代理函数):
• requestDidStartSelector当一个request开始执行时,这个代理函数会被调用。
• requestDidReceiveResponseHeadersSelector当队列中的request收到服务器返回的头信息时,这个代理函数会被调用。对于下载很大的文件,这个通常比整个request的完成要早。
• requestDidFinishSelector当每个request完成时,这个代理函数会被调用。
• requestDidFailSelector当每个request失败时,这个代理函数会被调用。
• queueDidFinishSelector当队列完成(无论request失败还是成功)时,这个代理函数会被调用。
ASINetworkQueues与NSOperationQueues稍有不同,加入队列的request不会立即开始执行。如果队列打开了进度 开关,那么队列开始时,会先对所有GET型request进行一次HEAD请求,获得总下载大小,然后真正的request才被执行。
向一个已经开始进行的ASINetworkQueue 加入request会怎样?
如果你使用ASINetworkQueue来跟踪若干request的进度,只有当新的request开始执行时,总进度才会进行自适应调整(向后 移动)。ASINetworkQueue不会为队列开始后才加入的request进行HEAD请求,所以如果你一次向一个正在执行的队列加入很多 request,那么总进度不会立即被更新。
如果队列已经开始了,不需要再次调用[queue go]。
当ASINetworkQueue中的一个request失败时,默认情况下,ASINetworkQueue会取消所有其他的request。要禁用这个特性,设置 [queue setShouldCancelAllRequestsOnFailure:NO]。
ASINetworkQueues只可以执行ASIHTTPRequest操作,二不可以用于通用操作。试图加入一个不是ASIHTTPRequest的NSOperation将会导致抛出错误。
取消异步请求
取消一个异步请求(无论request是由[request startAsynchronous]开始的还是从你创建的队列中开始的),使用[request cancel]即可。注意同步请求不可以被取消
安全地控制delegate防止request完成之前代理被释放
request并不retain它们的代理,所以有可能你已经释放了代理,而之后request完成了,这将会引起崩溃。大多数情况下,如果你的代理即将被释放,你一定也希望取消所有request,因为你已经不再关心它们的返回情况了。如此做:
1. // 代理类的dealloc函数
2. - (void)dealloc
3. {
4. [request clearDelegatesAndCancel];
5. [request release];
6. ...
7. [super dealloc]
登陆网页的服务器,用网络抓包工具抓取登陆信息, 想要用自定义的post发给服务器的登陆信息,直接登陆,用的是ASIFormDataRequest *request
ASIFormDataReques实现图片上传
1. 如果是 Get ,或者参数可以简单的组成 Get 方式提交的时候, 比如 thread.php?id=123 , 就用 ASIHTTPRequest 就可以了
原因是简单
2. 如果必须是 POST ,或者参数很多,你要构造一个带参数的 URL 很麻烦的时候,就用 ASIHttpFormDataRequest
用来接受图片标示符,并且使用 AFNetworking 的 AFImageRequestOperation 下载图片。
AFN默认没有封装同步请求,如果开发者需要使用同步请求,则需要重写getPath:parameters:success:failure方法,对 AFHTTPRequestOperation进行同步处理;而ASI则是直接通过调用一个startSynchronous方法
此外AFN针对JSON、XML、PList和Image四种数据结构封装了各自处理器,开发者可以把处理器注册到操作队列中,直接在回调方法中获得格式 化以后的数据。在示例工程中就使用了JSON处理器:把AFJSONRequestOperation注册到操作队列里。