与数据库打交道!!!
第一篇博文写了四个小时落下了阴影第二篇拖了很长时间.现补上!!
第一篇Hello world之后,觉得不与数据库打交道,没多大意思.于是乎上网搜寻了相关资料,目的是完成一个简易的注册.
前期准备工作.
- 新建一张表[User],简单一点,这张表只有三个字段 [UserID](pk,int),[UName](nvarchar (30)),[Psw](varchar(50)). (数据库使用的是SQL)
- 新建一个webservice(命名为:RegService.asmx),新建一个wcf(命名为Service.svc),新建一个一般处理程序(命名为:Reg.ashx),发布到IIS. (后面发放源码,可直接发布.)
- 下载 ASIHttpRequest (http://allseeing-i.com/ASIHTTPRequest/ 在这里可以下载到最新版本).
开始!
- New一个Project,选择Single View Applcation. 命名为 Reg.
- 以拖拽的方式,在界面放入两个文本框,分别命名为 txtName(用来接收用户名),txtPwd(用来接收密码),一个按钮,并拖拽出一个Touch Down方法(命名为 fnReg),添加一个手势,用于点击空白,隐藏键盘(命名为tgr).
代码如下:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *txtName;
@property (weak, nonatomic) IBOutlet UITextField *txtPwd;
@property (strong, nonatomic) IBOutlet UITapGestureRecognizer *tgr;
- (IBAction)fnReg:(id)sender;
@end
最终界面如下:
拖拽很容易,不熟悉这套可以看第一章 http://www.cnblogs.com/igqtdh/archive/2013/04/26/3043919.html
4. New Group 命名为ASIHttpRequest.
将下载好的 ASIHttpRequest/Classes里的内容拖拽到刚刚新建立的 ASIHttpRequest里.这一步有一点一定要注意,要选中第一个将文件添加到组,并且要勾选Add to targets.
(一共需要载入以下文件:ASIHTTPRequest\Classes目录的所有文件,注意,只要当前目录的文件,CloudFiles之类的目录不需要, 还有ASIHTTPRequest\External\Reachability目录的文件)
如果你没有勾选Add to targets这项,会报错,提示你没有编译这些文件.处理方法是.在Cmpile Sources里再添中这些文件.
再编译,就不会有错.但是! 因为这个版本的ASIHttpRequest没有arc,会有错.还是上面那个界面,在Compile Sourcs下面,选中刚从ASIHttpRequest里拉过来的那些文件,双击会出现弹出一个窗口,在里面输入-fno-objc-arc,如下图.(当初找到了解决方法,但找不到地方输入这个-fno-objc-arc, T T).
(1. 选中项目
2. 选中目标
3. 跳转到“Build Phases”标签
4. 展开“Link Binary With Libraries”分组
5. 点击“+”添加类库
libz.dylib,MobileCoreServices.framework,SystemConfiguration.framework,CFNetwork.framework
)
5. 修改 ViewControlle.m 代码. 如下.
#import "ViewController.h" #import "ASIHTTPRequest.h" #import "ASIFormDataRequest.h" @interface ViewController () @end @implementation ViewController @synthesize txtName; @synthesize txtPwd; @synthesize tgr; - (void)viewDidLoad { [super viewDidLoad]; tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKb:)]; tgr.cancelsTouchesInView = NO; [self.view addGestureRecognizer:tgr]; [txtPwd setSecureTextEntry:YES]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)fnReg:(id)sender { NSString *result = @"0"; UIAlertView *msgBox; //弹出窗 NSURL *url = [NSURL URLWithString:@"http://192.168.28.1/Reg.ashx"]; //新建一个url ,指向本地发布的.ashx ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; //new一个request [request setPostValue:txtName.text forKey:@"uname"]; //只有ASIFormDataRequest 可以设置参数 [request setPostValue:txtPwd.text forKey:@"pwd"]; NSError *error = [request error]; [request startSynchronous]; //这里是同步,如果选 startAsynchronous 那就是异步,异步需要定制 delegate, 开始发送请求!!!! start if(!error){ result = [request responseString]; //if (!error) 如果访问没有出错,因为我写的服务都是返回"text/plain". } if ([result integerValue] == 0){ msgBox = [[UIAlertView alloc] initWithTitle:@"注册" message:@"失败!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; //实例化弹出窗 }else{ msgBox = [[UIAlertView alloc] initWithTitle:@"注册" message:@"成功!" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; //实例化弹出窗 } @autoreleasepool { [msgBox show]; //显示窗口,这丢在自动释放池里.自动释放内存. } } -(void) hideKb:(UITapGestureRecognizer*) t{ [self.view endEditing:YES]; } @end
这里对上一章,补充一记.
上篇里写手势关闭键盘之里我用的是[txtName resignFirstResponder];,那我要是让多个文本框,都能关闭,就得写很多个[* resignFirstResponder],这样就很麻烦,改成[self.view endEditing:YES];就行了.
OK,运行.输入用户名,密码.弹出成功!查询数据库,数据保存进去了!
.ashx是.net里的一般处理程序,当然也可以换成.aspx,或者.php,.jsp.但是如果要用wcf或者webservice那么,这个wcf,webservice必须具备rest风格.
我会在文章后面放出我的.ashx,.asmx,.svc 源码(ios端就不放出来,咱是学ios嘛,还是手敲下,知道咱干了些啥),可直接发布到IIS.
如果要调用一个webservice.
改一处 NSURL *url = [NSURL URLWithString:@"http://192.168.28.1/RegService.asmx/Reg"]; 就行了,至于wcf,我返回的是json,这个ios端就没有处理了,简易嘛.
8.27补充:
在ios6 中presentModalViewController 方法已经不使用了,所以出现warning
product ->Build For -> Profiling 编译出现大量的warning。
presentModalViewController:animated: is deprecated :first deprecated in iOS6.0 。
[self presentModalViewController:pNewController animated:YES];
替换为
[self presentViewController:pNewController animated:YES completion:nil];
相对应的
dismissModalViewControllerAnimated :animated: is deprecated :first deprecated in iOS6.0
[self dismissModalViewControllerAnimated:YES];
替换为
[self dismissViewControllerAnimated:YEScompletion:nil];
如果你还有问题,留言.我会补充到文章里. 说不清的博文最讨厌了. 下载