创建一个单例对象,数据库写在单例文件里,有数据库的开闭,数据信息的增,删,改,查.
首先需要引入libsqlite3.0.dylib文件,方法: TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮查找添加即可
需要创建一个类,这里创建了一个学生类,声明属性:姓名,学号,性别,年龄几个属性
单例文件里写法
.h文件里声明
#import <Foundation/Foundation.h>
#import "Student.h"
@interface DataBaseHandle : NSObject
#pragma mark--------创建(获取)单例对象
+(instancetype)sharedInstance;
#pragma mark--------创建或者打开数据库
-(void)openDB;
//****************数据库管理的一些操作(增,删,改,查)***********************//
#pragma mark-------插入一个学生的信息
-(void)insertStudent:(Student *)student;
#pragma mark-------通过学号,删除一个学生的信息
-(void)deleteStudentByNumber:(NSInteger)number;
#pragma mark-------通过学号,修改一个学生的信息
-(void)updateStudent:(Student *)student ByNumber:(NSInteger)number;
#pragma mark-------根据年龄和学号,查询一个学生的信息
-(Student *)queryStudentByNumber:(NSInteger)number Age:(int)age;
#pragma mark-------查询所有学生的信息
-(NSArray *)queryAllStudents;
#pragma mark--------关闭数据库
-(void)closeDB;
@end
.m文件里实现声明的方法
#import "DataBaseHandle.h"
#import <sqlite3.h>
@implementation DataBaseHandle
static DataBaseHandle * dataBaseHandle = nil;
#pragma mark--------创建(获取)单例对象
+(instancetype)sharedInstance
{
@synchronized(self){
if (nil == dataBaseHandle) {
dataBaseHandle = [[DataBaseHandle alloc]init];
}
return dataBaseHandle;
}
}
#pragma mark--------创建或者打开数据库
//声明一个指向数据库对象的指针(代指数据库对象)
static sqlite3 *db = nil;
-(void)openDB
{
//如果数据库存在
if (nil != db) {
NSLog(@"当前数据库不为空!");
return ;
}
//如果数据库不存在
//1.存放数据库的路径和文件
NSString * path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
//拼接路径建立存放数据库的文件
NSString *dbPath = [path stringByAppendingPathComponent:@"students.txt"];
// NSString *name = @"xiaoli";
// [name writeToFile:dbPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",dbPath);
//2.根据路径创建并打开数据库
int result = sqlite3_open(dbPath.UTF8String, &db);
NSLog(@"%d",result);
//3.判断数据库是否打开或创建成功
if (result == SQLITE_OK) {
//4.准备创建数据库中的表
NSString * createTabelSQL = @"create table Students(name TEXT,number INTEGER PRIMARY KEY,sex TEXT,age INTEGER)";
//5.执行SQL语句
char *error = nil;
int result1 = sqlite3_exec(db, createTabelSQL.UTF8String, NULL, NULL, &error);
NSLog(@"%d",result1);
//6.判断SQL语句是否执行成功
if (result1 == SQLITE_OK) {
NSLog(@"数据库表创建或打开成功!");
}else{
NSLog(@"数据库表创建或打开失败!");
}
}
}
//****************数据库管理的一些操作(增,删,改,查)***********************//
#pragma mark-------插入一个学生的信息
-(void)insertStudent:(Student *)student
{
//1.打开数据库
[self openDB];
//2.准备插入操作的SQL语句(insert into 表名(字段1,字段2,....) values(值1,值2,.....))
NSString *insertSQL = [NSString stringWithFormat:@"insert into Students(name,number,sex,age) values('%@','%ld','%@','%ld')",student.name,student.number,student.sex,student.age];
//3.执行SQL语句
char * error = nil;
int result = sqlite3_exec(db, insertSQL.UTF8String, NULL, NULL, &error);
NSLog(@"%d",result);//输出为1,则说明SQL语句有问题
NSLog(@"%s",error);
//4.判断SQL语句是否执行成功
if (result == SQLITE_OK) {
NSLog(@"数据插入成功!");
}else{
NSLog(@"数据插入失败!");
}
//5.关闭数据库
[self closeDB];
}
#pragma mark-------通过学号,修改一个学生的信息
-(void)updateStudent:(Student *)student ByNumber:(NSInteger)number
{
//1.打开数据库
[self openDB];
//2.执行更新操作的SQL语句(update 表名 set 字段='值'....where 字段='值')
NSString * updateSQL = [NSString stringWithFormat:@"update Students set name='%@',number='%ld',sex='%@',age='%ld' where number='%ld'",student.name,student.number,student.sex,student.age,number];
//3.执行SQL语句
char * error = nil;
int result = sqlite3_exec(db, updateSQL.UTF8String, NULL, NULL, &error);
NSLog(@"%d,%s",result,error);
//4.判断SQL语句是否执行成功
if (result == SQLITE_OK) {
NSLog(@"更新成功!");
}else{
NSLog(@"更新失败!");
}
//5.关闭数据库
[self closeDB];
}
#pragma mark-------通过学号,删除一个学生的信息
-(void)deleteStudentByNumber:(NSInteger)number
{
//1.打开数据库
[self openDB];
//2.执行删除的SQL语句(delete from 表名 where 字段名 = '值'...)
NSString * deleteSQL = [NSString stringWithFormat:@"delete from Students where number = '%ld'",number];
//3.执行SQL语句
char *error = nil;
int result = sqlite3_exec(db, deleteSQL.UTF8String, NULL, NULL, &error);
NSLog(@"%d,%s",result,error);
//4.判断SQL语句是否执行成功
if (result == SQLITE_OK) {
NSLog(@"删除成功!");
}else{
NSLog(@"删除失败!");
}
//关闭数据库
[self closeDB];
}
#pragma mark-------根据年龄和学号,查询一个学生的信息
-(Student *)queryStudentByNumber:(NSInteger)number Age:(int)age
{
//1.打开数据库
[self openDB];
//2.SQL语句(select *from 表名 where number = ? and age = ?)
NSString * querySQL = @"select * from Students where number = ? and age = ?";
//3.创建一个跟随指针(指向存储执行SQL语句结果的空间)
sqlite3_stmt *stmt = NULL;
//4.执行SQL语句
int result = sqlite3_prepare_v2(db, querySQL.UTF8String, -1, &stmt, NULL);
//5.判断SQL语句是否执行成功
if (result == SQLITE_OK) {
//6.值的绑定(绑定'?'值),注意第二个参数是指SQL语句第几个'?'下标,是从1开始的.
sqlite3_bind_int(stmt, 1, (int)number);
sqlite3_bind_int(stmt, 2, age);
Student *stu = [[Student alloc] init];
if (sqlite3_step(stmt) == SQLITE_ROW) {
//7.通过stmt获取字段中的值
//①.获取数据库表中的第0列(name)字段的值
stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)];
//②.获取数据库表中的第1列(number)字段的值
stu.number = sqlite3_column_int(stmt, 1);
//③.获取数据库表中的第2列(sex)字段的值
stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
//④.获取数据库表中的第3列(age)字段的值
stu.age = sqlite3_column_int(stmt, 3);
}
//8.结束stmt跟随
sqlite3_finalize(stmt);
//9.关闭数据库
[self closeDB];
//10.返回查询到的数据
NSLog(@"查询成功!");
return stu;
}else{
NSLog(@"查询失败!");
//11.关闭数据库
[self closeDB];
return nil;
}
}
#pragma mark-------查询所有学生的信息
-(NSArray *)queryAllStudents
{
//1.打开数据库
[self openDB];
//2.查询操作的SQL语句(select * from 表名);
NSString * queryAllSQL = @"select * from Students";
//3.创建跟随指针
sqlite3_stmt *stmt =NULL;
//4.执行SQL语句
int result = sqlite3_prepare_v2(db, queryAllSQL.UTF8String, -1, &stmt, NULL);
//5.判断SQL语句是否执行成功
if (result == SQLITE_OK) {
//6.创建一个数据,用来存放每一个学生对象
NSMutableArray *studentArray = [NSMutableArray array];
//7.使用跟随指针获取每一个学生的信息.
while (sqlite3_step(stmt) == SQLITE_ROW) {
//8.获取数据库中,每一个字段值,并把每个字段值封装到Student对象中
Student *stu = [[Student alloc]init];
//①.获取数据库表中,第0列(name)字段中的值
stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)];
//②.获取数据库列表中,第1列字段(number)中的值
stu.number = sqlite3_column_int(stmt, 1);
//③.获取数据库列表中,第1列字段(sex)中的值
stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
//③.获取数据库列表中,第1列字段(age)中的值
stu.age = sqlite3_column_int(stmt, 3);
//9.将每一个封装好的student对象存入数据
[studentArray addObject:stu];
}
//10.结束stmt跟随
sqlite3_finalize(stmt);
//11.关闭数据库
[self closeDB];
//12.返回数组
NSLog(@"查询所有成员成功!");
return studentArray;
}else{
//13.如果SQL语句执行失败
[self closeDB];
NSLog(@"查询所有成员失败!");
return nil;
}
}
#pragma mark--------关闭数据库
-(void)closeDB
{
//1.执行关闭数据库的方法
int result = sqlite3_close(db);
//2.判断是否关闭成功
if (result == SQLITE_OK) {
NSLog(@"关闭成功!");
db = nil;
}else{
NSLog(@"关闭失败!");
}
}
具体用法这里简单举几个例子:
在需要使用的地方使用:
DataBaseHandle * handle = [DataBaseHandle sharedInstance];
//打开或创建
[handle openDB];
//关闭
[handle closeDB];
//创建一个学生对象
Student * stu = [[Student alloc] init];
stu.name = @"张三";
stu.number = 1;
stu.sex = @"男";
stu.age = 20;
//创建一个学生对象
Student * stu2 = [[Student alloc] init];
stu2.name = @"王五";
stu2.number = 2;
stu2.sex = @"男";
stu2.age = 26;
//插入一个学生的信息
[handle insertStudent:stu];
[handle insertStudent:stu2];
//更新number为1的学生的姓名=李四,age=21,sex=女
stu.name = @"李四";
stu.age = 21;
stu.sex = @"女";
[handle updateStudent:stu ByNumber:1];
//根据学号number删除一个学生的信息
[handle deleteStudentByNumber:1];
//查询学生
Student *stu1 = [handle queryStudentByNumber:1 Age:20];
NSLog(@"stu1 = %@",stu1);
//查询数据库中所有学生的信息
NSArray *array = [handle queryAllStudents];
NSLog(@"array = %@",array);