数据库 (代码)
//
// ViewController.m
// LessonUI_20_Sqlite(数据库)
//
// Created by lanou3g on 15/9/10.
// Copyright (c) 2015年
Lanou. All rights reserved.//
#import "ViewController.h"#import "DataBaseHanddle.h"#import "Student.h"
@interface
ViewController
()@end
@implementation ViewController- (void)viewDidLoad
{
[super
viewDidLoad];
// [[DataBaseHanddle shardInshtance]creatDB];
// 创建学⽣生对象
Student *stu1 =[[Student alloc]initWithName:@"张三"number:@"10001" age:23];
Student *stu2 = [[Student alloc]initWithName:@"⺩王五"number:@"10002" age:24];
Student *stu3 = [[Student alloc]initWithName:@"⻢马六"number:@"10003" age:26];
//
添加⼀一个学⽣生
[[DataBaseHanddle
shardInshtance]insertStudent:stu1];[[DataBaseHanddle
shardInshtance]insertStudent:stu2];[[DataBaseHanddle
shardInshtance]insertStudent:stu3];
//
修改⼀一个学⽣生
[[DataBaseHanddle
shardInshtance]updateNameOfStudent:@"李四"
byNumber:@"10001"];// 删除⼀一个学⽣生
[[DataBaseHanddle shardInshtance]deleteStudentByNumber:@"10001"];
//
查询所有学⽣生
NSArray
*array = [[DataBaseHanddle
shardInshtance]selectAllStudents]; NSLog(@"%@",array); // Do any additional setup after loading the view, typically
from a nib.
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// DataBaseHanddle.h
// LessonUI_20_Sqlite(数据库)
//
// Created by lanou3g on 15/9/10.
// Copyright (c) 2015年
Lanou. All rights reserved.//
#import <Foundation/Foundation.h>#import "Student.h"
@interface DataBaseHanddle : NSObject#pragma mark ------ 获取单例对新昂
+(instancetype)shardInshtance;#pragma mark ---创建(链接)数据库
-(void)creatDB;
#pragma mark ---向数据库表中添加(插⼊入)⼀一个学⽣生信息
-(void)insertStudent:(Student *)stu;
#pragma mark ----更新(修改)数据库表中某个学⽣生的信息(如:根据学号,修改学⽣生的姓名)
-(void)updateNameOfStudent:(NSString
*)name byNumber:(NSString*)number;
#pragma mark ---根据学号删除⼀一个学⽣生的所有信息-(void)deleteStudentByNumber:(NSString *)number;
#pragma mark ----查询数据库中所有学⽣生的信息-(NSArray *)selectAllStudents;
@end
//
// DataBaseHanddle.m
// LessonUI_20_Sqlite(数据库)
//
// Created by lanou3g on 15/9/10.
// Copyright (c) 2015年 Lanou. All rights reserved.//
#import "DataBaseHanddle.h"#import <sqlite3.h>
@interface DataBaseHanddle ()
{
sqlite3 *_db;}
@end
@implementation DataBaseHanddlestatic
DataBaseHanddle
*handle =
nil;
#pragma mark ------ 获取单例对象+(instancetype)shardInshtance
{ @synchronized(self){
if (handle == nil) {
handle = [[DataBaseHanddle alloc]init];}
}
return
handle;
}
#pragma mark ---创建(链接)数据库-(void)creatDB
{
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).lastObject;
NSString *dbPath = [documentPathstringByAppendingPathComponent:@"student.db"];
NSLog(@"%@",dbPath);
//这个函数打开了⼀一个sqlite数据库⽂文件的链接并且返回了⼀一个数据库链接对象int result = sqlite3_open(dbPath.UTF8String, &_db);
if
( result ==
SQLITE_OK) {NSLog(@"创建链接数据库成功");
//
如果数据库创建成功,就可以创建表了
[self creatTable];
}else
{
NSLog(@"创建(链接)数据库失败!
%d",result);
// 表⽰示的是数据库链接对象,对数据库中表的操作都是基于这个链接的
// 指定存放在沙盒中的数据库路径NSString *documentPath =
}}
#pragma mark ---创建数据库中的表(table)-(void)creatTable
{
INTEGER, stu BLOB, number TEXT PRIMARY KEY);";// 2、执⾏行语句
char *errmsg = NULL;
int result = sqlite3_exec(_db, creatSql.UTF8String, NULL, NULL,&errmsg);
if (result == SQLITE_OK) {NSLog(@"创建表成功");
}else {
NSLog(@"创建表失败 ! %s",errmsg);}
}
#pragma mark ---关闭数据库(链接)-(void)closeDB
{
int
result = sqlite3_close(_db);if
(result ==
SQLITE_OK) {
NSLog(@"关闭链接成功");
_db = NULL;}else {
NSLog(@"关闭失败 !%d",result);}
}
#pragma mark ---向数据库表中添加(插⼊入)⼀一个学⽣生信息-(void)insertStudent:(Student *)stu
{
[selfcreatDB];
//打开数据库链接
// 1、准备SQL语句
//
形式:insert into
表名(字段1,字段2...)
values(?,?,?,?)
NSString *insertSQL = @"insert intostudents(name,age,stu,number) values(?,?,?,?)";
// 跟随指针 ,能够 ⽤用sqlite3_step() 这个函数来执⾏行 编译完成的 你所准备的SQL语句 的指针。 在sqlite⾥里并没有定义sqlite_stmt这样类型的指针,它是⼀一个抽象类型(结构体指针)
sqlite3_stmt
*stmt = nil;
// 2、检查SQL语句的语法是否正确
// 1、准备创建表的SQL语句
//形式:creat
table 表名(字段1
类型,字段2
类型)
NSString
*creatSql =
@"CREATE TABLE students (name TEXT, age
int result = sqlite3_prepare_v2(_db, insertSQL.UTF8String, -1,&stmt, NULL);
NSLog(@"%d",result);
if
(result ==
SQLITE_OK) {
//
给字段绑定值
#warning mark ----第⼆二参数是从1开始的,对应的是第⼏几个
'?'
号
sqlite3_bind_text(stmt, 1, [stu.name UTF8String], -1, NULL);sqlite3_bind_int(stmt, 2, stu.age);sqlite3_bind_text(stmt, 4, [stu.number UTF8String], -1,
NULL);
#pragma mark ---将复杂对象转换为NSData,才能存⼊入数据库中
//
归档
NSMutableData
*data = [NSMutableData
data];NSKeyedArchiver
*archiver = [[NSKeyedArchiver
alloc]initForWritingWithMutableData:data];[archiver encodeObject:stu forKey:[NSString
stringWithFormat:@"student%@",stu.number]];[archiver finishEncoding];
sqlite3_bind_blob(stmt, 3, [data bytes], (int)[data length],
NULL);
//
执⾏行准备好且编译好的SQL语句
// 这个⽅方法⽤用于执⾏行 sqlite_praPare_v2() 检查通过的SQL语句,这个语句执⾏行到结果的第⼀一⾏行可⽤用的位置(如果你进⾏行的数据库操作是:insert,updata,delete),只需要执⾏行⼀一次这个⽅方法就可以
sqlite3_step(stmt); }
// 销毁你前⾯面sqlite3_prepare_v2() 所检查通过的SQL语句 (结束跟随指针)sqlite3_finalize(stmt);
// 关闭数据库链接[self closeDB];
}
#pragma mark ----更新(修改)数据库表中某个学⽣生的信息(如:根据学号,修改学⽣生的姓名)
-(void)updateNameOfStudent:(NSString
*)name byNumber:(NSString*)number
{
[self
creatDB];
// 1、准备SQL语句(更新)
// 形式:update
表名
set
字段
= '值'
where 字段
= '值'
NSString
*upDataSql =
@"update students set name = ? where
number = ?";
// 2、检查SQL语句是否合法
//
跟随指针
sqlite3_stmt
*stmt = NULL;
int result = sqlite3_prepare_v2(_db, upDataSql.UTF8String, -1,&stmt, NULL);
NSLog(@"%d",result);
if
(result ==
SQLITE_OK) {
//
绑定字段
sqlite3_bind_text(stmt,
1, [name
UTF8String], -1,
NULL);sqlite3_bind_text(stmt,
2, [number
UTF8String], -1,
NULL);
// 执⾏行
sqlite3_step(stmt); }
// 结束跟随指针sqlite3_finalize(stmt);
[self closeDB];}
#pragma mark ---根据学号删除⼀一个学⽣生的所有信息-(void)deleteStudentByNumber:(NSString *)number
{
[self
creatDB];
//
准备SQL语句(删除)
//形式:deletefrom表名where
字段=值
NSString
*deleteSql =
@"delete from students where number = ?";
//
检查SQL语句是否合法
//
跟随指针
sqlite3_stmt
*stmt = nil;
int result = sqlite3_prepare_v2(_db, deleteSql.UTF8String, -1,&stmt, NULL);
if (result == SQLITE_OK) {// 绑定字段
sqlite3_bind_text(stmt,
1, [number
UTF8String], -1,
NULL);//
执⾏行
sqlite3_step(stmt);
}
// 结束跟随指针sqlite3_finalize(stmt);
[self closeDB];}
#pragma mark ----查询数据库中所有学⽣生的信息-(NSArray *)selectAllStudents
{
[self
creatDB];
//
准备SQL语句(查询)
// 形式:select * from
表名
NSString
*sql = @"select * from students";//
2、检查SQL语句
sqlite3_stmt
*stmt = nil;
int result = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt,NULL);
NSMutableArray *studentsArray = [NSMutableArray array];if (result == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) { //表⽰示查找到了⼀一条 正确数据
//
取字段下的值
#warning mark ----sqlite_column_xxx⽅方法中的第⼆二个参数与数据库表中的字段的顺序是⼀一致的。(下标从0开始)
NSString *name = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 0)];
int age = sqlite3_column_int(stmt, 1);
NSString *number = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 3)];
NSData *data = [NSDatadataWithBytes:sqlite3_column_blob(stmt, 2)length:sqlite3_column_bytes(stmt, 2)];
// 反归档
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
Student *stu = [unarchiver decodeObjectForKey:[NSStringstringWithFormat:@"student%@",number]];
[unarchiver finishDecoding];
NSLog(@"%@
%@ %@ %d",number,name,stu,age);
// 将 反归档得到的Student 对象存⼊入数组[studentsArray addObject:stu];
}
} sqlite3_finalize(stmt);
[self closeDB];return studentsArray;
}
@end