与数据库打交道!!!

第一篇博文写了四个小时落下了阴影第二篇拖了很长时间.现补上!!

第一篇Hello world之后,觉得不与数据库打交道,没多大意思.于是乎上网搜寻了相关资料,目的是完成一个简易的注册.

前期准备工作.

  1. 新建一张表[User],简单一点,这张表只有三个字段 [UserID](pk,int),[UName](nvarchar (30)),[Psw](varchar(50)). (数据库使用的是SQL)
  2. 新建一个webservice(命名为:RegService.asmx),新建一个wcf(命名为Service.svc),新建一个一般处理程序(命名为:Reg.ashx),发布到IIS. (后面发放源码,可直接发布.)
  3. 下载 ASIHttpRequest (http://allseeing-i.com/ASIHTTPRequest/ 在这里可以下载到最新版本).

开始!

  1. New一个Project,选择Single View Applcation. 命名为 Reg.
  2. 以拖拽的方式,在界面放入两个文本框,分别命名为 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];

 

 

如果你还有问题,留言.我会补充到文章里. 说不清的博文最讨厌了.  下载

 

posted on 2013-05-11 00:39  小心新手出没  阅读(449)  评论(0编辑  收藏  举报