SQLite介绍
SQLite是一款轻型的嵌入式数据库,安卓和iOS开发使用的都是SQLite数据库。
它的特点:
- 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
- 它的处理速度比MySQL、PostgreSQL这两款著名的数据库都还快。
- 它是C语言框架的,跨平台性强。
要在iOS中使用SQLite3,需要在Xcode导入libsqlite3的库
下面是结合SQL语句完成数据库操作,使用到的是下面定义的方法:
创建表:
create table 表名称(字段1,字段2,……,字段n,[表级约束])[TYPE=表类型];
插入记录:
insert into 表名(字段1,……,字段n) values (值1,……,值n);
删除记录:
delete from 表名 where 条件表达式;
修改记录:
update 表名 set 字段名1=值1,……,字段名n=值n where 条件表达式;
查看记录:
select 字段1,……,字段n from 表名 where 条件表达式;
1,打开数据库
使用的C语言函数如下:
/* 打开数据库 */
int sqlite3_open(
const char *filename, /* 数据库路径(UTF-8) */
sqlite3 **pDb /* 返回的数据库句柄 */
);
2,查询数据库
使用的C语言函数:
/* 执行有返回结果的SQL语句 */
int sqlite3_prepare_v2(
sqlite3 *db, /* 数据库句柄 */
const char *zSql, /* SQL语句(UTF-8) */
int nByte, /* SQL语句最大长度,-1表示SQL支持的最大长度 */
sqlite3_stmt **ppStmt, /* 返回的查询结果 */
const char **pzTail /* 返回的失败信息*/
);
3,插入数据
使用的C语言函数:
/* 执行有返回结果的SQL语句 */
int sqlite3_prepare(
sqlite3 *db, /* 数据库句柄 */
const char *zSql, /* SQL语句(UTF-8) */
int nByte, /* SQL语句最大长度,-1表示SQL支持的最大长度 */
sqlite3_stmt **ppStmt, /* 返回的查询结果 */
const char **pzTail /* 返回的失败信息*/
);
4.删除数据库
使用的C语言函数:
/* 执行没有返回的SQL语句 */
int sqlite3_exec(
sqlite3 *db, /* 数据库句柄 */
const char *sql, /* SQL语句(UTF-8) */
int (*callback)(void*,int,char**,char**), /* 回调的C函数指针 */
void *arg, /* 回调函数的第一个参数 */
char **errmsg /* 返回的错误信息 */
);
5, 关闭数据库
使用的C语言函数:
/* 关闭数据库 */
int sqlite3_close(sqlite3 *db);
下面来个小例子:
这里请求数据是微博的用户名和id 定义一个模型
DataModel.h
#import <Foundation/Foundation.h>
@interface DataModel : NSObject
@property (nonatomic, copy) NSString *screen_name;
@property (nonatomic, copy) NSString *avatar_hd;
- (instancetype)initWithDictionary:(NSArray *)dictionary;
@end
DataModel.m
#import "DataModel.h"
@implementation DataModel
- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
if (self = [super init]) {
// 当有很多属性 一个一个的写 太麻烦了,
// 一句话搞定
[self setValuesForKeysWithDictionary:dictionary];
}
return self;
}
// 一般情况下 请求数据回来,里面包含很多数据,要一个一个的写,写错了一个就报错
// 请求数据回来有很多,但你又用不上,就写上这个方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
// 打印的是 你没用到的key
NSLog(@"%@",key);
}
@end
在定义一个处理数据库的类 DataBase
DataBase.h
#import <Foundation/Foundation.h>
/** 导入DataModel*/
#import "DataModel.h"
@interface DataBase : NSObject
/** 打开数据库*/
+ (void)openDB;
/** 查*/
+ (NSArray *)find;
/** 插*/
+ (BOOL)insertModel:(DataModel *)dataModel;
+
/** 删除*/
+ (BOOL)deleteModel:(DataModel *)dataModel;
@end
DataBase.m
#import "DataBase.h"
// 导入
#import <sqlite3.h>
@implementation DataBase
// 创建一个数据库对象
static sqlite3 *db;
#pragma mark - 打开数据库
+ (void)openDB {
// 将导入的数据库移动到 Documents 文件夹下
// 首先要在外面创建一个数据库 把数据库导入工程里面 "这一步 一定要做"
// 拿到数据库的路径
// 这里 WeiBo 是创建数据库的名称 (千万不要搞错)
NSString *originPath = [[NSBundle mainBundle] pathForResource:@"WeiBo" ofType:@"sqlite"];
// Documents 文件夹下的路径 然后进行拼接
NSString *targetPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"collection.sqlite"];
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:targetPath]) {
[manager moveItemAtPath:originPath toPath:targetPath error:nil];
}
char *filename = (char *)[targetPath UTF8String];
// 打开数据库
int result = sqlite3_open(filename, &db);
if (result == SQLITE_OK) {
NSLog(@"数据库开启成功");
} else {
NSLog(@"数据库开启失败");
}
}
#pragma mark - 查
+ (NSArray *)find {
NSMutableArray *mArray = [NSMutableArray array];
// 打开数据库
[self openDB];
// 声明一个陈述
sqlite3_stmt *stmt = nil;
// 查表
// 这里 weiBo 是创建数据库下的表名称 (千万不要搞错)
const char *sql = "select *from weiBo";
// 将sql 文本转成一个 语句对象
int result = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
if (result == SQLITE_OK) {
NSLog(@"准备查询成功");
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 提取数据
const char *screen_name = (const char *)sqlite3_column_text(stmt, 0);
const char *avatar_hd = (const char *)sqlite3_column_text(stmt, 1);
DataModel *dataModel = [[DataModel alloc] init];
dataModel.screen_name = [NSString stringWithCString:screen_name encoding:4];
dataModel.avatar_hd = [NSString stringWithCString:avatar_hd encoding:4];
//"NSNumber 类型 " [NSNumber numberWithInteger:[[NSString stringWithCString:deal_id encoding:4] integerValue]];
[mArray addObject:dataModel];
}
}
return mArray;
}
#pragma mark - 插
+ (BOOL)insertModel:(DataModel *)dataModel {
// 打开数据库
[self openDB];
sqlite3_stmt *stmt = nil;
// 这里 weiBo 是创建数据库下的表名称 (千万不要搞错)
const char *sql = "insert into weiBo(screen_name, avatar_hd) values(?, ?)";
// 将 sql 文本转换成一个 语句对象
int result = sqlite3_prepare(db, sql, -1, &stmt, nil);
if (result == SQLITE_OK) {
//将要插入的数据插入到数据库
sqlite3_bind_text(stmt, 1, [dataModel.screen_name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [dataModel.avatar_hd UTF8String], -1, nil);
//[NSNumber] sqlite3_bind_text(stmt, 1, [[NSString stringWithFormat:@"%@",model.comment_num] UTF8String], -1, nil);
if (sqlite3_step(stmt) == SQLITE_DONE) {
flag = YES;
}
}
return flag;
}
#pragma mark - 删
+ (BOOL)deleteModel:(DataModel *)dataModel {
BOOL flag = NO;
// 打开数据库
[self openDB];
// 这里 weiBo 是创建数据库下的表名称 (千万不要搞错)
NSString *sql = [NSString stringWithFormat:@"delete from weiBo where screen_name = %@", dataModel.screen_name];
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
if (result == SQLITE_OK) {
NSLog(@"删除成功");
flag = YES;
} else {
NSLog(@"删除失败");
}
return flag;
}
@end
创建数据库
(用火狐浏览器)
1,SQLite Manager下载
2,创建数据库有几种方法(这理就不一一介绍了) 我的是火狐浏览器里面的数据库
打开浏览器 –> 工具 –> 找到SQLite Manager
3,点击:SQLite Manager 页面是这样
4,创建数据库
5,桌面 把它拖到工程中
6,创建数据库的表(表里面创建字段 可以理解为属性)
7,表创建成功后