Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

时间:2023-03-08 16:57:24

第一步:下载第三方库,点击 连接 下载,

第二部:准备数据库:按照连接&中博客的步骤实现数据库,

数据库的设计大致如下表:

id        username             password         registertime      realname            groupid             

 
   

新建一个单视图工程,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

关闭arc  (Automatic reference count)自动引用计数,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

添加 sqlite3.dylib 类库的包含,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

将准备好的第三方库FMDB 以及准备好的数据库包含在项目中,包含时要注意选中copy 选项,不然只是单纯的引用到项目中,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

包含后项目结构如下,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

单击打开 wsqViewController.xib  拖放两个UILable ,并分别设置title属性为 "用户名" 和 " 密码" ,然后拖放两个Text Field ,再拖放一个UIButton title属性设置为登录,布局随意,

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

为两个TextField 设置Placeholder属性,这个就是水印属性,用来添加水印提示,当点击输入任何一个字符的时候就会消失。。

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

为控件连线,分别为两个TextField 连接连个插座变量 分别命名为textUserName 和 textPwd ,为UIButton 连接一个action 事件,命名为btnClick。(注意红色箭头标注的关键点)

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录     Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

为连个TextField 添加键盘消失的方法,首先让 wsqViewController 遵循 UITextFieldDelegate 协议 ,

@interface wsqViewController : UIViewController<UITextFieldDelegate>

并且在 wsqViewController.m 中重写- (BOOL)textFieldShouldReturn:(UITextField *)textField;方法,

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}

其实主要是让两个TextField 在结束的时候调用 resignFirstResponder 方法,通过将代理 delegate 指向File's Owner,在单击小键盘return 键和敲键盘回车键的时候让小键盘消失。

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

因为我们是在单击UIbutton的时候来判断是否登录成功,所以,所有的赋值和取值的操作都可以放在btnClick 事件里面来操作,

但是这样会在单击button的时候增加响应时间,所以我们把一些基本的操作还是放在- (void)viewDidLoad 里面,这里面主要就是

把数据库拷贝直应用程序的沙盒中,因为在mainBundle 目录下,所有系统的文件都是不可以通过程序来操作的,任何操作都会返回nil。

操作其他应用程序也不行,这样每一个应用程序都在自己的沙盒中运行,从而不会影响其他的应用程序。

在 wsqViewController.h 添加一个实例变量,为NSString 类型,用来存放数据库在沙盒中的路径。不要忘记在 dealloc 中release,并且在.m文件中实现它:@synthesize tempPath;

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

在viewDidLoad 中添加代码:主要是获取user.db在目录中的路径然后通过 NSFileManager 类中的方法,将数据库拷贝至沙盒目录下。

- (void)viewDidLoad
{
[super viewDidLoad];
//获取 user.db在目录中的路径
NSString* strBundlePath = [[NSBundle mainBundle] pathForResource:@"user.db" ofType:nil];
//获取应用程序沙盒下所有文件夹 的路径
NSArray* arrayDocunmentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//获取应用程序沙盒下 doucumnet文件夹 的路径
NSString* strDocunmentPath = [arrayDocunmentPath objectAtIndex:];
//为文件夹路径附加文件路径,
NSString* destinationPath = [strDocunmentPath stringByAppendingString:@"user.db"];
NSFileManager* fManager = [NSFileManager defaultManager];
//实例化一个NSFileManager 将文件拷贝至沙盒目录下。
if(![fManager fileExistsAtPath:destinationPath]){
NSError* error= nil;
[fManager copyItemAtPath:strBundlePath toPath:destinationPath error:&error];
if(error){
NSLog(@"%@",error);
}
}
//retain 一次,不然会在出了括号之后就会释放,
tempPath = [destinationPath retain];
}

在wsqViewController.h 文件中包含第三方库的头文件:

#import "FMDatabase.h"

在btnClick 方法中添加代码:

- (IBAction)btnClick:(id)sender {
[textUserName resignFirstResponder];
[textPwd resignFirstResponder]; //创建一个第三方库的对象 ,用数据库路径来初始化,
FMDatabase* fmDatebase = [[FMDatabase alloc] initWithPath:tempPath];
//连接数据库,并做判断
if(![fmDatebase open]){
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"数据库连接" message:@"连接失败" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil];
//显示消息框,
[alert show];
// alloc 出来的空间必须释放
[alert release];
}
//sql语句
NSString* executeStr = [NSString stringWithFormat:@"select * from \"member\" where username =\"%@\" and password = \"%@\"",textUserName.text,textPwd.text];
//sql语句执行之后返回一个FMResultSet容器。
FMResultSet * fmSet = [fmDatebase executeQuery:executeStr];
//扑捉sql异常错误,
if([fmDatebase hadError]){
NSLog(@"%i ,%@",[fmDatebase lastErrorCode],[fmDatebase lastErrorMessage]);
return ;
}
//循环容器
while ([fmSet next]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"success" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil];
[alert show];
[alert release];
}
if([fmDatebase hadError]){
NSLog(@"%i ,%@",[fmDatebase lastErrorCode],[fmDatebase lastErrorMessage]);
return ;
} //关闭连接,以及容器
[fmDatebase close];
[fmSet close];
//alloc 出来的空间必须释放。
[fmDatebase release]; }

然后点击run 运行结果如下:

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

最后为应用程序添加事先准备的图标和应用程序启动动画:

lanch.jpg 和icon.jpg

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

打开 .plist文件 ,修改icon 。并且添加 一项lanch

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

修改后结果如下图:

Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

#import <UIKit/UIKit.h>
#import "FMDatabase.h" @interface wsqViewController : UIViewController<UITextFieldDelegate> {
UITextField *textUserName;
UITextField *textPwd;
NSString* tempPath;
} @property (retain, nonatomic) IBOutlet UITextField *textUserName;
@property (retain, nonatomic) IBOutlet UITextField *textPwd;
@property (retain,nonatomic) NSString* tempPath;
- (IBAction)btnClick:(id)sender; @end
//
// wsqViewController.m
// loginTest
//
// Created by administrator on 13-9-4.
// Copyright (c) 2013年 __MyCompanyName__. All rights reserved.
// #import "wsqViewController.h" @implementation wsqViewController
@synthesize textUserName;
@synthesize textPwd;
@synthesize tempPath; - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
} #pragma mark - View lifecycle - (void)viewDidLoad
{
[super viewDidLoad];
//获取 user.db在目录中的路径
NSString* strBundlePath = [[NSBundle mainBundle] pathForResource:@"user.db" ofType:nil];
//获取应用程序沙盒下所有文件夹 的路径
NSArray* arrayDocunmentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//获取应用程序沙盒下 doucumnet文件夹 的路径
NSString* strDocunmentPath = [arrayDocunmentPath objectAtIndex:];
//为文件夹路径附加文件路径,
NSString* destinationPath = [strDocunmentPath stringByAppendingString:@"user.db"];
NSFileManager* fManager = [NSFileManager defaultManager];
//实例化一个NSFileManager 将文件拷贝至沙盒目录下。
if(![fManager fileExistsAtPath:destinationPath]){
NSError* error= nil;
[fManager copyItemAtPath:strBundlePath toPath:destinationPath error:&error];
if(error){
NSLog(@"%@",error);
}
} tempPath = [destinationPath retain]; } - (void)viewDidUnload
{
[self setTextUserName:nil];
[self setTextPwd:nil];
[super viewDidUnload]; } - (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
} - (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
} - (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
} - (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
[textUserName resignFirstResponder];
[textPwd resignFirstResponder];
return YES;
} - (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
} - (void)dealloc {
[textUserName release];
[textPwd release];
[tempPath release];
[super dealloc];
}
- (IBAction)btnClick:(id)sender {
[textUserName resignFirstResponder];
[textPwd resignFirstResponder]; //创建一个第三方库的对象 ,用数据库路径来初始化,
FMDatabase* fmDatebase = [[FMDatabase alloc] initWithPath:tempPath];
//连接数据库,并做判断
if(![fmDatebase open]){
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"数据库连接" message:@"连接失败" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil];
//显示消息框,
[alert show];
// alloc 出来的空间必须释放
[alert release];
}
//sql语句
NSString* executeStr = [NSString stringWithFormat:@"select * from \"member\" where username =\"%@\" and password = \"%@\"",textUserName.text,textPwd.text];
//sql语句执行之后返回一个FMResultSet容器。
FMResultSet * fmSet = [fmDatebase executeQuery:executeStr];
//扑捉sql异常错误,
if([fmDatebase hadError]){
NSLog(@"%i ,%@",[fmDatebase lastErrorCode],[fmDatebase lastErrorMessage]);
return ;
}
//循环容器
while ([fmSet next]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"success" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil];
[alert show];
[alert release];
}
if([fmDatebase hadError]){
NSLog(@"%i ,%@",[fmDatebase lastErrorCode],[fmDatebase lastErrorMessage]);
return ;
} //关闭连接,以及容器
[fmDatebase close];
[fmSet close];
//alloc 出来的空间必须释放。
[fmDatebase release]; }
@end