您的位置:首页 > 产品设计 > UI/UE

UI day 18 数据库SQL语句

2015-12-21 21:02 453 查看
1. 在”ViewController.m.中写
#import
"ViewController.h"

#import "DataBaseHandle.h"

#import "Student.h"
@interface
ViewController ()
@property
(retain,
nonatomic)
IBOutlet
UITextField *numberField;//学号
@property
(retain,
nonatomic)
IBOutlet
UITextField *nameField;//姓名
@property
(retain,
nonatomic)
IBOutlet
UITextField *genderField;//性别
@property
(retain,
nonatomic)
IBOutlet
UITextField *ageField;//年龄
@end
@implementation
ViewController
//添加学生

- (IBAction)insertStudent:(UIButton
*)sender {

    if
(0
== self.nameField.text.length
||
0==
self.genderField.text.length
||0==
self.ageField.text.length)
{

        return;
    }
//创建student对象存储控件中输入的能容

    Student
*stu = [[Student
alloc]init];

    stu.name
= self.nameField.text;

    stu.gender
= self.genderField.text;

    stu.age
= [self.ageField.text
integerValue];

    [[DataBaseHandle
shareDataBaseHandle]insertStudent:stu];
    [stu
release];
  <
4000
/span>
}
//更新学生

- (IBAction)updateStudent:(id)sender
{
   
NSString *gender =
self.genderField.text;//获取输入框的内容

    NSInteger
number = [self.numberField.text
integerValue];

    [[DataBaseHandle
shareDataBaseHandle]updataStudentGender:gender
byNumber:number];

   

}
//删除学生

- (IBAction)deleteStudent:(id)sender

{

    NSInteger
number= [self.numberField.text
integerValue];

    [[DataBaseHandle
shareDataBaseHandle]deleteOneStudentBuNumber:number];

}
//查找某个学生

- (IBAction)selectOneStudent:(id)sender

{

    NSInteger
number = [self.numberField.text
integerValue];//获取学号输入框内容
//   
调用根据学号查询学生的方法

  Student
*stu =[[DataBaseHandle
shareDataBaseHandle]selectOneStudentByNumber:number];

    NSLog(@"======%@",stu);

}
//查找所有学生

- (IBAction)selectAllStudent:(id)sender
{
   
NSMutableArray *contentArray = [[DataBaseHandle
shareDataBaseHandle]selectAllStudent];

    for
(Student
*stu in
contentArray) {

        NSLog(@"%@",stu);

    }

}

- (void)viewDidLoad {

    [super
viewDidLoad];
//    [DataBaseHandle shareDataBaseHandle];//内部打开数据库
//    [[DataBaseHandle shareDataBaseHandle]closeDatabase];//关闭数据库

  

    NSLog(@"%@",NSHomeDirectory());

  
}
- (void)dealloc {

    [_ageField
release];

    [_genderField
release];

    [_nameField
release];

    [_numberField
release];

    [super
dealloc];

}
@end

2.在DataBaseHandle.h中写

#import
<Foundation/Foundation.h>
@class
Student;
@interface
DataBaseHandle : NSObject
//创建单例的方法 
第一步

+ (DataBaseHandle
*)shareDataBaseHandle;

- (void)openDataBase;//打开数据库的方法

- (void)closeDatabase;//关闭数据库的方法
//插入学生对象的接口

- (void)insertStudent:(Student
*)student;

- (NSMutableArray
*)selectAllStudent;//返回表格中所有学生的接口
//根据唯一标示学号删除学生

- (void)deleteOneStudentBuNumber:(NSInteger)number;
//根据唯一标示学号修改学生的性别

- (void)updataStudentGender:(NSString
*)gender byNumber:(NSInteger)number;
//根据学号查找学生
- (Student
*)selectOneStudentByNumber:(NSInteger)number;
@end

3.在DataBaseHandle.m中写

#import
"DataBaseHandle.h"

#import <sqlite3.h>

#import "Student.h"
@implementation
DataBaseHandle

 static
DataBaseHandle *handle =
nil;
//单例第二步

+ (DataBaseHandle
*)shareDataBaseHandle

{

    @synchronized(self){

        if
(handle
== nil) {

            handle
= [[DataBaseHandle
alloc]init];

            [handle
openDataBase];//让单例对象以创建出来就可以访问数据库

17483

        }

    }

   

    return
handle;

}

//返回数据库文件的路径 
数据库第一步

- (NSString
*)dataBasePath{
//   
将数据库文件放到Documents文件夹下,student.sqllite

   

    return
[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES)lastObject]stringByAppendingPathComponent:@"student.sqlite"];

   

}

static
sqlite3 *db =
nil;//定义一个全局且在静态区的数据库

- (void)openDataBase

{
//1.现货区数据文件的路径

    NSString
*dbPath = [self
dataBasePath];
//   
使用数据库语句(sql)之前一定要导入libsqlite3.0动态链接类库,其中libsqlite3.0是快捷方式libsqlite3.是实体类库,导入快捷方式的好处,当版本更新的时候,不用在导入新的实体类库,因为快捷方式永远指向的都是最新的实体类库
//    2.使用sql语句打开数据库 
UTF8String将OC字符串转换为C语言字符串 
sqlite3是数据库指针
//   
创建数据库指针db
//    sqlite3 *db = nil;
//   
方法执行完内部会对数据库指针db初始化
方法执行完如果正确无误就会存在数据库文件 
此方法会先检查文件路径中有没有对应的数据库文件,没有的话创建,有的话直接打开

   int
result =  sqlite3_open([dbPath
UTF8String], &db);
//  SQLITE_OK说明sql语句成功

    if
(result == SQLITE_OK) {

        NSLog(@"数据库打开成功");
//       
创建表格
//       
准备sql语句

        NSString
*sqlString = @"create table if not exists Student(stu_number integer primary key autoincrement,stu_name text,stu_gender text,stu_age integer)";
//       
执行sql语句

        sqlite3_exec(db, [sqlString
UTF8String],

                     NULL,
NULL,
NULL);

       

    }else{

       

        NSLog(@"数据库打开失败");

    }

}

//关闭数据库

- (void)closeDatabase

{

  int
result = sqlite3_close(db);

    NSLog(@"%@",(result ==
SQLITE_OK) ?@"关闭成功":@"关闭失败");

 

}
///插入学生的接口

- (void)insertStudent:(Student
*)student

{
//    1.打开数据库

    [self
openDataBase];
//    2.准备插入SQL语句

    NSString
*sqlString = @"insert into Student(stu_name,stu_gender,stu_age)values(?,?,?)";
//    3.创建数据库管理指针(数据库管理指令集)

    sqlite3_stmt
*stmt = nil;
//    4.验证SQL语句是否正确
//   
参数1:数据库指针 
参数2:SQL语句
参数3:SQL语句的长度
-1
自动计算SQL语句的最大长度,否则自己计算长度
参数4:SQL语句的管理指针 
参数5:预留参数
未来使用

  int
result = sqlite3_prepare_v2(db, [sqlString
UTF8String], -1, &stmt,
NULL);
//    5.那验证的结果,判断是否执行参数绑定的操作

    if
(result == SQLITE_OK) {

        NSLog(@"插入成功");
//       
绑定字段stu_name的数据
//       
参数1:SQL语句管理指针
参数2:上面SQL语句中问号的位置,下标为1 
参数3:要绑定的数据
参数4:数据的长度

        sqlite3_bind_text(stmt,
1, [student.name
UTF8String], -1,
NULL);//绑定name数据

        sqlite3_bind_text(stmt,
2, [student.gender
UTF8String], -1,
NULL);//绑定gender数据
//       
绑定字段age的数据

        sqlite3_bind_int(stmt,
3, (int)student.age);
//        6.让SQL语句执行

        sqlite3_step(stmt);
//

    }
//    7.释放掉管理指针

    sqlite3_finalize(stmt);

    //        8.关闭数据库

    [self
closeDatabase];

}

- (NSMutableArray
*)selectAllStudent

{
// 
打开数据库

    [self
openDataBase];
//   
准备SQL语句

    NSString
*sqlString= @"select *from Student";
//    3.创建管家指针

    sqlite3_stmt  *stmt =
nil;
//    4.验证SQL语句是否正确

 int
resule = sqlite3_prepare_v2(db, [sqlString
UTF8String], -1, &stmt,
NULL);
//   
创建数组存放找到的所有学生对象

    NSMutableArray
*array = [NSMutableArray
arrayWithCapacity:0];

   

   

    if
(resule == SQLITE_OK) {

        NSLog(@"查找全部语句成功");
//       
如果SQLITE_ROW说名下一行是有数据的,循环继续,如果不等于SQLITE_ROW。说名下一行没有数据了,循环结束了

        while
(sqlite3_step(stmt)==SQLITE_ROW) {
//           
、依次读出字段中的数据 列的编号是从0开始的

            int
number = sqlite3_column_int(stmt,
0);
//           
第1列

            NSString
*name =  [NSString
stringWithUTF8String:(const
char
*)sqlite3_column_text(stmt,
1)];
//           
第2列

            NSString
*gender = [NSString
stringWithUTF8String:(const
char
*)sqlite3_column_text(stmt,
2)];
//           
第三列

            int
age = sqlite3_column_int(stmt,
3);
//           
创建学生对象并赋值

            Student
*stu = [[Student
alloc]init];

            stu.number
= number;

            stu.name
= name;

            stu.gender
= gender;

            stu.age
= age;

            [array addObject:stu];

            [stu release];

           

        }
//        6.释放管理指针

        sqlite3_finalize(stmt);

        [self
closeDatabase];

        return
array;

       

    }else{

        sqlite3_finalize(stmt);

        [self
closeDatabase];

        return
nil;

    }

}

//根据唯一标示学号删除学生

- (void)deleteOneStudentBuNumber:(NSInteger)number

{
//    1.打开数据库

    [self
openDataBase];
//    2.准备SQL语句

    NSString
*sqlString = @"delete from Student  where stu_number = ?";
//    3.创建管家指针

    sqlite3_stmt
*stmt = nil;
//    4.验证SQL语句是否正确

    int
resule = sqlite3_prepare_v2(db,[sqlString
UTF8String], -1, &stmt,
NULL);

    if
(resule == SQLITE_OK) {
//    5.绑定传过来的参数

        sqlite3_bind_int(stmt,
1, (int)number);

        sqlite3_step(stmt);

    }
//    6.释放管家指针

    sqlite3_finalize(stmt);
//    7.关闭数据库

    [self
closeDatabase];

   

}

//根据唯一标示学号修改学生的性别

- (void)updataStudentGender:(NSString
*)gender byNumber:(NSInteger)number

{

    [self
openDataBase];

    NSString
*sqlString = @"update Student set stu_gender = ? where stu_number = ? ";

    sqlite3_stmt
*stmt = nil;

    int
resule = sqlite3_prepare_v2(db, [gender
UTF8String], -1, &stmt,
NULL);

    if
(resule == SQLITE_OK) {

        sqlite3_bind_text(stmt,
1, [sqlString
UTF8String], -1,
NULL);

        sqlite3_bind_int(stmt,
2, (int)number);//第二个参数是?在SQL语句中的位置,位置从一开始

        sqlite3_step(stmt);

    }

    sqlite3_finalize(stmt);

    [self
closeDatabase];

}

//根据学号查找学生

- (Student
*)selectOneStudentByNumber:(NSInteger)number

{

    [self
openDataBase];

    NSString
*sqlString = @"select * from Student where stu_number = ?";

    sqlite3_stmt
*stmt = nil;

    int
resule = sqlite3_prepare_v2(db, [sqlString
UTF8String], -1, &stmt,
NULL);

    if
(resule == SQLITE_OK) {

        sqlite3_bind_int(stmt,
1, (int)number);
//       
创建Model对象

        Student
*stu = [[Student
alloc]init];
//       
遍历表格中的数据

        while
(sqlite3_step(stmt)==SQLITE_ROW) {
//           
根据找的数据给学生的属性赋值

            stu.number
= number;

            stu.name
=[NSString
stringWithUTF8String:(const
char
*) sqlite3_column_text(stmt,
1)];

            stu.gender
= [NSString
stringWithUTF8String:(const
char
*) sqlite3_column_text(stmt,
2)];
            stu.age
=
sqlite3_column_int(stmt,
3);    
        }

        sqlite3_finalize(stmt);

        [self
closeDatabase];

        return
[stu autorelease];

       

    }else

    sqlite3_finalize(stmt);

    [self
closeDatabase];

    return
nil;

   

}

4.
#import <Foundation/Foundation.h>

@interface
Student : NSObject
@property
(nonatomic,assign)NSInteger
number;
@property
(nonatomic,copy)NSString
*name;
@property
(nonatomic,copy)NSString
*gender;
@property
(nonatomic,assign)NSInteger
age;
@end

#import
"Student.h"

@implementation
Student

- (void)dealloc

{

    self.name
=
nil;

    self.gender
=
nil;

    [super
dealloc];

   

   

}

- (NSString
*)description

{

    return
[NSString
stringWithFormat:@"%ld %@ %@ %ld",
self.number,self.name,self.gender,self.age];

}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 sql