SQLite数据库
使用步骤:
1. 引入libsqlite3.0框架
2. 在数据库操作类里 引入
创建单例类实现数据库的管理使用
// 单例的初始化方法
+ (SQLiteManager *)shareManager;
// 插入数据
- (void)insertTableWithStudent:(Student *)stu;
// 删除数据
- (void)deleteWithAge:(NSInteger)age;
// 更新
- (void)updateAge:(NSInteger)age byName:(NSString *)name;
// 查询
- (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age;
方法实现
// 单例类初始化方法
+ (SQLiteManager *)shareManager{
// 静态区指针
static SQLiteManager *manager = nil;
if (manager == nil) {
manager = [[SQLiteManager alloc] init];
// 调用创建表的方法
[manager createTable];
}
// 为保证程序运行期间一直存在 所以不手动释放
// 程序运行结束 自动释放
return manager;
}
创建数据库对象
// 需要在静态去定义一个指针 (让这个指针指向的对象 从程序开始到结束 一直存在)
// 程序结束后被系统自动释放
static sqlite3 *db = nil;
打开数据库
// 打开数据库
- (sqlite3 *)openDatabase{
// 判断数据库是否存在 如果存在的话 直接返回
if (db != nil) {
return db;
}
// 不存在 则创建一个并打开
// 获取Documents的路径
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接数据库文件路径 (拼接的数据的文件的名字)
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];
NSLog(@"%@",dbPath);
// 创建或者打开数据库
// 参数1 文件路径(需要把OC的字符串转化成C语言的) dbPath.UTF8String
// 参数2 数据库的地址
// 接收一下返回值 判断是否打开成功
int result = sqlite3_open(dbPath.UTF8String, &db);
// 用SQLITE_OK可以查表得到错误
if (result == SQLITE_OK) {
NSLog(@"打开成功");
}else{
NSLog(@"打开失败");
}
return db;
}
关闭数据库
// 关闭数据库
- (void)closeDatabase{
int result = sqlite3_close(db);
// 判断关闭是否成功
if (result == SQLITE_OK) {
// 把数据库的指针 重置为空
db = nil;
NSLog(@"关闭成功");
}else{
NSLog(@"关闭失败");
}
}
创建表
// 创建表(要有主键值)
- (void)createTable{
// 注意 一定在操作时, 先打开数据库
// 操作完毕,关闭数据
// 打开数据库
db = [self openDatabase];
// 1.写sql语句
NSString *sql = @"create table IF NOT EXISTS Student(number Integer primary key not NULL, name text not NULL, gender text not NULL, age Integer not NULL, data BLOB not NULL)";
// 2.执行sql语句
// 准备与执行的操作
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"建表成功");
}else{
NSLog(@"建表失败");
}
// 关闭数据库
[self closeDatabase];
}
插入数据
// 插入数据
- (void)insertTableWithStudent:(Student *)stu{
// 打开数据库
db = [self openDatabase];
// 写sql语句
NSString *sql = @"insert into Student(number, name, gender, age, data) values(?, ?, ?, ?, ?)";
// 创建一个跟随指针(指令集)
sqlite3_stmt *stmt = nil;
// 执行sql语句
// 预执行函数 需要用跟随指针 绑定问号
// 然后一步一步执行(判断sql语句是否正确)
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);
if (result == SQLITE_OK) {
// 绑定问号(根据sql语句来决定 绑定的顺序)
// 注意:绑定的顺序 从1开始
// 参数2 绑定顺序
// 参数3 绑定的值
sqlite3_bind_int(stmt, 1, (int)stu.number);
// 参数4 字符串长度 一般填- 1
sqlite3_bind_text(stmt, 2, stu.name.UTF8String, - 1, NULL);
sqlite3_bind_text(stmt, 3, stu.gender.UTF8String, - 1, NULL);
sqlite3_bind_int(stmt, 4, (int)stu.age);
// 绑定二进制数据
// [stu.data bytes]
// 相当于获取到data数据的内容
// (int)stu.data.length
// 相当于获取到data数据的长度
sqlite3_bind_blob(stmt, 5, [stu.data bytes], (int)stu.data.length, NULL);
// 执行绑定语句
sqlite3_step(stmt);
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
// 不管插入是否成功 都要释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDatabase];
}
*****不绑定进行插入操作******
/**
* 如果有data数据进行插入操作 sqlite3_exec函数 会把data数据转化成字符串存入数据库
* 也就是说你插入的数据没有data数据 直接使用sqlite3_exec这个函数进行操作 无需使用下面的函数进行绑定
* NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')";
*/
//- (void)text:(Student *)stu{
//
// NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')";
//
// NSString *sqlNew = [NSString stringWithFormat:@"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')", stu.number, stu.name, stu.gender, stu.age];
//
//}
删除数据(根据一个条件删除)
// 删除数据(根据一个条件删除)
- (void)deleteWithAge:(NSInteger)age{
// 打开数据库
// db = [self openDatabase];
#pragma mark --- 不当绑定删除 需要拼接sql语句
// // 写SQL语句
// NSString *sql = @"delete from Student where age > '%ld'";
//
// // 拼接sql语句
// NSString *sqlNew = [NSString stringWithFormat:@"delete from Student where age > '%ld'",age];
//
// // 执行sql语句
// int result = sqlite3_exec(db, sqlNew.UTF8String, NULL, NULL, NULL);
//
// // 判断一下执行结果
// if (result == SQLITE_OK) {
//
// NSLog(@"删除成功");
//
// }else{
//
// NSLog(@"删除失败");
//
// }
//
// // 关闭数据库
// [self closeDatabase];
#pragma mark --- 通过绑定删除法
// 打开数据库
db = [self openDatabase];
// 写SQL语句
NSString *sql = @"delete from Student where age > ?";
// 创建跟随指针
sqlite3_stmt *stmt = nil;
// 预执行sql语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);
if (result == SQLITE_OK) {
// 绑定问号
sqlite3_bind_int(stmt, 1, (int)age);
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
// 执行绑定的语句
sqlite3_step(stmt);
// 不管成功与否 都要释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDatabase];
}
更新数据
// 更新数据(根据一个条件来更新)
- (void)updateAge:(NSInteger)age byName:(NSString *)name{
// 打开数据库
db = [self openDatabase];
// 写sql语句
NSString *sql = [NSString stringWithFormat:@"update Student set age = '%ld' where name = '%@'", age, name];
// 执行sql语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"更新成功");
}else{
NSLog(@"更新失败");
}
// 关闭数据库
[self closeDatabase];
}
根据条件查询数据
// 根据条件查询数据
- (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age{
// 打开数据库
db = [self openDatabase];
// 写sql语句
NSString *sql = @"select * from Student where name = ? and age = ?";
// 创建跟随指针
sqlite3_stmt *stmt = nil;
// 创建一个对象
Student *stu = [[Student alloc] init];
// 预执行sql语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);
if (result == SQLITE_OK) {
// 绑定问号
sqlite3_bind_text(stmt, 1, name.UTF8String, - 1, NULL);
sqlite3_bind_int(stmt, 2, (int)age);
// 查询时 如果下一行准备好了 返回 SQLITE_ROW
// 这时可以继续查询
// int iCol列数
// 如果你是查询所有的字段的话 那个这个列表 就根据你创建的建表的顺序一样
// 注意:从0开始
// 如果你查询的是特定的字段 那么这个列数就要根据你的sql语句来写
// 也是从0开始
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 读取数据
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
// 读取二进制数据
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
// 赋值model
// stringWithUTF8String 把C语言字符串转化成OC字符串
stu.name = [NSString stringWithUTF8String:name];
stu.gender = [NSString stringWithUTF8String:gender];
stu.number = number;
stu.age = age;
stu.data = data;
}
NSLog(@"查询成功");
}else{
NSLog(@"查询失败");
}
// 执行sql语句
sqlite3_step(stmt);
// 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDatabase];
// 自动释放 对象
return [stu autorelease];
}
查询所有行(返回一个数组)
// 查询所有行(返回一个数组)
- (NSArray *)selectAllRows{
// 打开数据库
[self openDatabase];
// 写sql语句
NSString *sql = @"select * from Student";
// 创建一个可变数组备用
NSMutableArray *array = [NSMutableArray array];
// 创建跟随指针
sqlite3_stmt *stmt = nil;
// 预执行
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);
// 创建一个对象
Student *stu = [[Student alloc] init];
if (result == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 从数据库中读取数据
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
// 读取二进制数据
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
// 赋值model
stu.name = [NSString stringWithUTF8String:name];
stu.gender = [NSString stringWithUTF8String:gender];
stu.number = number;
stu.age = age;
stu.data = data;
// 添加到数组
[array addObject:stu];
[stu release];
}
NSLog(@"成功");
}else{
NSLog(@"失败");
}
// 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDatabase];
return array;
}