ios数据库操作 : 利用单例对数据库进行管理
数据库操作: 创建数据库 创建表 关闭数据库 增 删 改 查 操作
// 初始化单例方法 在单例中进行初始化
+ (SqlLiteManger *)shareManger;
// 如果要使用数据库 需要引用一个框架
// 引入一个libsqlite3.0框架 引入头文件 sqlite3.h
// 数据库操作第一步 打开 数据库
- (sqlite3 *)openDB;
// 数据库 关闭
- (void)closeDB;
// 数据库 创建表
- (void)createTable;
// 数据库插入操作 StudentModel 是一个model类
- (void)insertInto:(StudentModel *)student;
// 删除 根据条件删除
- (void)deleStudentWithAge:(NSInteger)age;
// 修改
- (void)updataName:(NSString *)name setAge:(NSInteger)age;
// 查询 分为单条查询 和 多条查询
- (StudentModel *)selectName:(NSString *)name andAge:(NSInteger)age;
// 查询全部
- (NSArray *)selectAllStudent;
实现初始化方法 在初始化之前需要理解 ios中sqlLite3 的语句 在这最容易出现问题的就是sql语句
// 初始化 单例方法
+ (SqlLiteManger *)sharManger
{
static SqlLiteManger *man = nil;
if (man == nil) {
man = [[SqlLiteManger alloc]init];
}
return man;
}
// 数据库操作之前需要 先定义个 指针 用来负责连接数据库 能够保证数据库从开始到结束都能够使用 在关闭的时候释放
// 创建连接数据库的指针
static sqlite3 *db = nil;
// 打开数据库
- (sqlite3 *)openDB
{
if (db != nil) {
return db;
}
// 不存在就去创建一个数据库 先找到存放数据库的位置
NSString *document = [NSSearchPathForDirectoriesInDocument(NSDocumentDirectory, NSUserDomainMask, YES)lastobject];
// 在document 文件夹下面添加数据库文件
NSString *path = [document stringByAppendPathCompoent:@"Student.sqlite"];
// 创建数据库
int result = sqlite3_open(path.UTF8String, &db);
if (result == SQLITE_OK) {
NSLog(@"数据库创建成功");
} else
{
NSLog(@"数据库创建失败");
}
return db;
}
// 关闭数据库
- (void)closeDB
{
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"关闭成功");
// 如果关闭成功 就把数据库置为空 下次操作的时候 再次创建
db = nil;
} else
{
NSLog(@"关闭失败");
}
}
操作数据库步骤大致有以下几步:
1 打开数据库
2 写sql语句
3 执行sql语句
4 判断sql语句 是否成功
5 关闭数据库
// 创建数据库表
- (void)createTable
{
db = [self openDB];
NSString sql = @"create table IF NOT EXISTS LanStudent(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL);";
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"创建成功");
} else
{
NSLog(@"创建失败");
}
[self closeDB];
}
// 插入(增加)
- (void)insertInto:(StudentModel *)student
{
db = [self openDB];
NSString *sql = [NSString stingWithFormat:@"insert into LanStudent(number, name, gender, age) values('%ld', '%@', '%@', '%ld');", student.number, student.name, student.gender, student.age];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"插入成功");
} else
{
NSLog(@"插入失败");
}
[self closeDB];
}
// 删除
- (void)deleStudentWithAge:(NSInteger)age
{
db= [self openDB];
NSString *sql = [NSString stringWithFormat:@"delete from LanStudent where age > '%ld'", age];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"删除成功");
} else
{
NSLog(@"删除失败");
}
[self closeDB];
}
// 更改
// 更新数据库
- (void)updataName:(NSString *)name setAge:(NSInteger)age
{
db = [self openDB];
NSString *sql = [NSString stringWithFormat:@"update LanStudent set age = '%ld' where name = '%@'", age, name];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"更改成功");
} else
{
NSLog(@"更改失败");
}
[self closeDB];
}
// 查询
// 查询操作比其他的操作复杂
// 单条查询
- (StudentModel *)selectName andAge:(NSInteger)age
{
db = [self openDB];
NSString *sql = [NSString stringWithFormat:@"select * from LanStudent where name = @'%@' and age = '%ld'", name, age];
// 创建一个 跟随指针 用来保存sql语句
sqlite3_stmt *stmt = nil;
int result = sqlit3_prepare_v2(db, sql.UTF8Strig, -1, &stmt, NULL);
if(result == SQLITE_OK) {
NSLog(@"成功");
sqlite3_bind_text(stmt, 1, name.UFT8String, -1, NULL);
// 参数2 查询条件的顺序
// 参数3 查询条件的字段名称 需要转换为c 语言格式
// 参数4 长度 -1
// 参数5 绑定后执行的函数 一般写 NULL
sqlite3_bind_int(stmt,2, -1);
// 开始查询
while (sqlite3_step(stmt) == SQLITE_ROW) {
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number = sqlite3_column_int(stmt, 0);
// 给model赋值
StudentModel *model = [[StudentModel alloc]init];
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String;gender];
model.age = age;
model.number = number;
// 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];
// 返回数据 并且释放对象
[self closeDB];
return [model autorelease];
}
} else
{
NSLog(@"失败");
}
[self closeDB];
return nil;
}
// 查询全部
// 查询所有
- (NSArray *)selectAllStudent
{
// 1
db = [self openDB];
// 2
NSString *sql = [NSString stringWithFormat:@"select * from LanOuStudent"];
// 3 创建一个跟随指针
sqlite3_stmt *stmt = nil;
// 4 运行
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
// 5
if (result == SQLITE_OK) {
NSLog(@"查询成功");
//6 不用绑定 改成创建一个数组 用来保存 查询好的model
NSMutableArray *array = [NSMutableArray array];
// 7 开始查询
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 8 读取数据
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
int number =sqlite3_column_int(stmt, 0);
// 9 给model赋值
LanOuStudent *model = [[LanOuStudent alloc]init];
model.name = [NSString stringWithUTF8String:name];
model.gender = [NSString stringWithUTF8String:gender];
model.age = age;
model.number = number;
// 10 把model 放到数组里面
[array addObject:model];
// 11 释放学生对象
[model release];
}
// 12 释放跟谁指针
sqlite3_finalize(stmt);
// 13 关闭数据库
[self closeDB];
// 14 返回数组
return array;
} else
{
NSLog(@"查询失败");
}
// 16
[self closeDB];
return nil;
}
注释;在以后使用时发现查询全部出现问题,解决如下
#pragma mark -- 查询全部
- (NSArray *)selectAllActivity{
NSMutableArray *selectArray = [NSMutableArray array];
if ([self.db open]) {
NSString *sql = [NSString stringWithFormat:@"select * from t_student ORDER BY dataTime DESC"];
FMResultSet *set = [self.db executeQuery:sql];
while ([set next]) {
Student *student = nil;
NSInteger num = [set intForColumn:@"num"];
NSString * archiverKey = [NSString stringWithFormat:@"%@%ld",@"student",num];
NSData *data = [set dataForColumn:@"data"];
student = [[FMDBHelper shareManager]unarchiverObject:data forKey:archiverKey];
[selectArray addObject:student];
}
[self.db close];
}
return selectArray;
}