Sqlite数据库
来源:互联网 发布:python exe 编辑:程序博客网 时间:2024/05/22 16:50
这里我把数据库做成了单例 方便使用
//注意 在使用之前要添加依赖库 libsqlite3.0tbd
在.h里主要写暴露给外部的方法 代码如下:
@interface DataBaseHandle : NSObject// 把这个类写成单例 方便外部使用+ (DataBaseHandle *)shareDataBaseHandle;//打开数据库- (void)openDataBase;//关闭数据库- (void)closeDataBase;//创建表- (void)createTable;//插入数据- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;//通过uid去更新数据- (void)updateWithUID:(NSInteger)uid;//根据uid去删除数据- (void)deleteWithUID:(NSInteger)uid;//查找所有数据- (void)searchAll;//根据名字去查找相关的数据信息- (void)searchWithName:(NSString *)name;@end
在.m实现相关方法 (这里没用到 第三方 sql语句写的可能比较繁琐)
#import "DataBaseHandle.h"#import <sqlite3.h>@interface DataBaseHandle()///数据库的存储路径@property (nonatomic, copy) NSString *dbPath;@endstatic DataBaseHandle *dataBase = nil;@implementation DataBaseHandle+ (DataBaseHandle *)shareDataBaseHandle { if (dataBase == nil) { dataBase = [[DataBaseHandle alloc] init]; } return dataBase;}//懒加载需要给数据库路径赋值- (NSString *)dbPath { if (_dbPath == nil) { // 需求:路径存储在Documents文件夹下,数据库文件为person.sqlite NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"]; } return _dbPath;}//好多地方都会使用到数据库 所以初始化一个数据库的静态变量static sqlite3 *db = nil;- (void)openDataBase { //打开数据库 使用int去接收打开的结果 //第一个参数:filename 代表数据库的存储路径 //第二个参数 二级指针 数据库的地址 int result = sqlite3_open([self.dbPath UTF8String], &db); //result 是个枚举值 有很多种情况 if (result == SQLITE_OK) { NSLog(@"数据库打开成功"); } else { NSLog(@"数据库打开失败"); }}- (void)closeDataBase { int result = sqlite3_close(db); if (result == 0) { NSLog(@"数据库关闭成功"); } else { NSLog(@"数据库关闭失败"); }}- (void)createTable { //创建一个person表 字段:uid integer类型 主键 自增 不能为空,name text类型,gender text类型,age integer类型 NSString *createStr = @"create table person(uid integer primary key autoincrement not null, name text, gender text, age integer)"; //第一个参数:数据库 //第二个参数 sql语句 需要进行编码 //第三个参数 结果回调的一个函数 //第四个参数 回调函数的一个参数 int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL); if (result == SQLITE_OK) { NSLog(@"创建成功"); } else { NSLog(@"创建失败"); } NSLog(@"%@", _dbPath);}- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age { NSString *insertStr = @"insert into person(name, gender, age)values(?, ?, ?)"; sqlite3_stmt *stmt = nil; //预执行语句 //第一个参数 数据库 //第二个参数 sql语句 //第三个参数 有正负之分 例如:1代表只往后读一个字节 如果为负 遇到特殊符号才会结束读取(\000,u000) //第四个参数 伴随指针 会随着数据库的相关操作确定其中?的值 //第五参数 取值的时候取的不全 剩下的值都存在这里 int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL); //判断执行结果 if (result == SQLITE_OK) { //在操作成功的方法里进行?值的一些绑定设置 //第一个参数 伴随指针 //第二个参数 ?位置 从1开始 //第三个参数 表示要插入的值 //第四个值 有正负之分 例如:1代表只往后读一个字节 如果为负 遇到特殊符号才会结束读取(\000,u000) sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL); sqlite3_bind_int64(stmt, 3, age); //sql语句执行完毕 //执行伴随指针 根据伴随指针的情况判定是否插入成功 if (sqlite3_step(stmt) == SQLITE_DONE) { NSLog(@"插入成功"); } else { NSLog(@"插入失败"); } }else { NSLog(@"result = %d", result); } //一定要释放伴随指针 sqlite3_finalize(stmt);}- (void)updateWithUID:(NSInteger)uid { sqlite3_stmt *stmt = nil; NSString *updateStr = @"update person set name = '悟空' where uid = ?"; int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL); if (result == SQLITE_OK) { sqlite3_bind_int64(stmt, 1, uid); if (sqlite3_step(stmt) == SQLITE_DONE) { NSLog(@"跟新数据成功"); } else { NSLog(@"更新数据失败"); } } else { NSLog(@"result = %d", result); } sqlite3_finalize(stmt);}- (void)deleteWithUID:(NSInteger)uid { NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid]; int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL); if (result == SQLITE_OK) { NSLog(@"删除成功"); } else { NSLog(@"删除失败"); }}- (void)searchAll { NSString *searchAllStr = @"select *from person"; sqlite3_stmt *stmt = nil; //预执行 int result = sqlite3_prepare(db, searchAllStr.UTF8String, -1, &stmt, NULL); if (result == SQLITE_OK) { //查询数据的时候不知道有少次的时候使用while循环 //sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据 while (sqlite3_step(stmt) == SQLITE_ROW ) { //第一个参数 伴随指针 //第二个参数 代表这个字段的位置【只有带?的是从1开始 其余的所有都是从0开始】 int uid = sqlite3_column_int(stmt, 0); NSString *name = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 1)]; NSString *gender = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(stmt, 2)]; int age = sqlite3_column_int(stmt, 3); NSLog(@"%d, %@, %@, %d", uid, name, gender, age); } }else { NSLog(@"result = %d", result); } sqlite3_finalize(stmt);}- (void)searchWithName:(NSString *)name { NSString *searchStr = @"select uid, gender, age from person where name = ?"; sqlite3_stmt *stmt = nil; int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL); if (result == SQLITE_OK) { sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); while (sqlite3_step(stmt) == SQLITE_ROW) { int uid = sqlite3_column_int(stmt, 0); NSString *gender = [NSString stringWithUTF8String:(const char*) sqlite3_column_text(stmt, 1)]; int age = sqlite3_column_int(stmt, 2); NSLog(@"%d, %@, %d", uid, gender, age); } } else { NSLog(@"result = %d", result); } sqlite3_finalize(stmt);}
当需要用到数据库存储数据的时候就可以引入 然后调用相应的方法了
0 0
- SQLite---SQLite数据库简介
- Sqlite 数据库
- SQLite数据库
- SQlite 数据库
- SQLite数据库
- SQLite数据库
- SQLite数据库
- SQLite数据库
- SQLite数据库
- SQlite数据库
- sqlite数据库
- SQLite 数据库
- SQLite数据库
- SQLite数据库
- SQLite数据库
- SQLITE数据库
- SQLite数据库
- sqlite数据库
- 数据控制语言(DCL)
- Java - 计蒜客 - 判断质数
- Java - 计蒜客 - 简单斐波那契
- postgresql authentication failed
- 在引用外部开发包时关联源码及文档
- Sqlite数据库
- 49. Group Anagrams
- 深入学习java并发编程:内存模型(三)顺序一致性
- Java - 计蒜客 - 矩阵翻转
- 【SQL Sever】 函数的创建
- 被砍项目之总结
- @property里assgin 、copy、strong的区别
- Android学习笔记-自定义view
- C++对象内存分布(包括字节对齐和虚函数表)