#import <Foundation/Foundation.h>
#import <sqlite3.h>//2.引入sqlite3头文件
//3.定义静态的数据库指针
.
static sqlite3 *dbPoint = nil;
@interface SqlDB : NSObject
+(sqlite3 *)openDB;
@end
sqlite 的方法
sqlite3 *db, 数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open(), 打开数据库,没有数据库时创建。
sqlite3_exec(), 执行非查询的sql语句
Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(), 关闭数据库文件
还有一系列的函数,用于从记录集字段中获取数据,如
sqlite3_column_text(), 取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据
下面给大家演示下我自己写的增删改查:
打开数据库:
#import "SqlDB.h"
@implementation SqlDB
+(sqlite3 *)openDB{
//如果数据库存在,就直接返回,不用在走下面的代码了。
if (dbPoint) {
return dbPoint;
}
//Document路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [NSString stringWithFormat:@"%@/db",path];
NSLog(@"\npath ==== %@",path);
//判断数据库是否存在,若存在就不拷贝,反之拷贝。
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
//获得将要拷贝的文件路径,bundle路径
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"sqlite"];
NSLog(@"\nsourcePath === %@",sourcePath);
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:path error:&error];
if (error) {
NSLog(@"error ==== %@",error);
}
}
//创建数据库的指针对象
sqlite3_open([path UTF8String], &dbPoint);
return dbPoint;
}
@end
我为增删改查写了类
<pre name="code" class="objc">#import <Foundation/Foundation.h>
@class SqlModel;
@interface NovelDataBase : NSObject
+(NSArray *)selectAllNovel;
+ (SqlModel *)selectWithId:(NSInteger)num;
+ (void)insertWithModel:(SqlModel *)model;
+ (void)updateWithModel:(NSInteger)num bookName:(NSString *)name;
+ (void)deleteWithModel:(NSInteger)num;
@end
查询数据库某一张表所有信息:
<pre name="code" class="objc">+(NSArray *)selectAllNovel{
NSMutableArray *results = [NSMutableArray array];
sqlite3 *db = [SqlDB openDB];//获得数据库指针
sqlite3_stmt *stmt = nil;//创建一个数据库的替身
//数据库查询语句
NSString *sqlStr = [NSString stringWithFormat:@"select nv_id,nv_author,nv_bookName,nv_score from Novel"];
//替身放我数据库得到的结果
//检验你的sql语句是否正确
//通过sql语句进行查询,并且将查询结果赋值给替身
int result = sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, NULL);
//判断查询结果是否正确,如果result的值是SQLITE_OK,则表明准备好statement,接下来执行查询:
if (result == SQLITE_OK) {
//while循环把数据一条一条取出来
while (sqlite3_step(stmt) == SQLITE_ROW) {
//区第一列的数据,第一个参数是替身,第二个参数是对应sql语句列
int nid = sqlite3_column_int(stmt, 0);
const unsigned char *nauthor = sqlite3_column_text(stmt, 1);
const unsigned char *nbooName = sqlite3_column_text(stmt, 2);
float nscore = sqlite3_column_double(stmt, 3);
NSString *bookName = [NSString stringWithUTF8String:(const char *)nbooName];
NSString *author = [NSString stringWithUTF8String:(const char *)nauthor];
SqlModel *model = [SqlModel sqlModelNId:nid NBookName:bookName NAuthor:author NScore:nscore];
[results addObject:model];
}
}
//在返回数组执勤我们要把替身干掉。
sqlite3_finalize(stmt);
return results;
}
根据id查找所有信息:
<pre name="code" class="objc">+ (SqlModel *)selectWithId:(NSInteger)num{
//NSMutableArray *results = [NSMutableArray array];
sqlite3 *db = [SqlDB openDB];
sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"select nv_id,nv_author,nv_bookName,nv_score from Novel where nv_id=%d",num];
int result = sqlite3_prepare(db, [sqlStr UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
NSInteger nid = sqlite3_column_int(stmt, 0);
const unsigned char *nauthor = sqlite3_column_text(stmt, 1);
const unsigned char *nbooName = sqlite3_column_text(stmt, 2);
float nscore = sqlite3_column_double(stmt, 3);
NSString *bookName = [NSString stringWithUTF8String:(const char *)nbooName];
NSString *author = [NSString stringWithUTF8String:(const char *)nauthor];
SqlModel *model = [SqlModel sqlModelNId:nid NBookName:bookName NAuthor:author NScore:nscore];
//[results addObject:model];
return model;
}
}
sqlite3_finalize(stmt);
return nil;
}
插入:
#pragma mark insert
+ (void)insertWithModel:(SqlModel *)model{
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"insert into Novel (nv_id,nv_author,nv_bookName,nv_score)values(%d,'%@','%@',%f)",model.nId,model.nAuthor,model.nBookName,model.nScore];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Success");
}
}
修改或更新:
<pre name="code" class="objc">#pragma mark update
+ (void)updateWithModel:(NSInteger)num bookName:(NSString *)name{
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"update Novel set nv_bookName='%@' where nv_id = %d",name,num];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Update Success");
}
}
删除:
<pre name="code" class="objc">#pragma mark delete
+ (void)deleteWithModel:(NSInteger)num {
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"delete from Novel where nv_id=%d",num];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Delete Success");
}
}