由于新公司目前只用到这两个功能, 所以我自己也就只封装了这两个功能而已
如果以后加入的话, 会继续更新, 封装文件CJSQlite
首先是, 创建表格
我把整个数据库的插入和获取功能都写到了CJSQlite这个类中
打开数据库并创建表格:
我之前的文章已经有简单的写到怎样创建表格, 蓝牙4.0 测试与数据的存储(SQLite), 这里再讲解一下
1. 配置数据库,libsqlite3.tdb框架,具体位置如下:
2. 导入头文件
#import
3. CJSQlite.h中的实现
#import
#import
#import "User.h"
@interface CJSQlite : NSObject
@property (nonatomic, assign) sqlite3 *db;
/**
* 单例
*/
+ (instancetype)sharedCJSQlite;
/**
* 创建表
*/
- (void)creatSQLiteTable;
/**
* 插入数据(可根据实际情况修改)
*/
- (void)insertDataToSQliteWithLat:(NSString *)lat Lon:(NSString *)lon Phone:(NSString *)Phone DateTime:(NSString *)DateTime Status:(int)status;
/**
* 查询数据
*/
- (void)SearchDataFromTable;
@end
4. CJSQlite.m中的逻辑实现
- 1 实现单例, 并抛异常
static CJSQlite *CJLite = nil;
// 程序启动的时候,就马上创建一个CJSQlite
// 怎么才能知道程序启动?
// 作用:加载类到内存
// 什么时候调用:程序一启动就会加载类到内存
// 只会调用一次,类只需要加载一次
+ (void)load
{
// 创建person对象
[self sharedCJSQlite];
}
+ (instancetype)sharedCJSQlite
{
// 代码块里面的东西只会执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"dispatch_once");
CJLite = [[self alloc] init];
});
// 创建Person对象
return CJLite;
}
+ (instancetype)alloc
{
// 第一次不需要抛异常
if (CJLite) {
// 抛异常
// Name:异常的名称
// reason:异常的原因
NSException *exce = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
[exce raise];
}
return [super alloc];
}
- 2.创建表的方法实现封装(这个方法同时打开数据库)
- (void)creatSQLiteTable
{
if (_db != nil) {
return;
}
// 0.获取沙盒地址
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"MobP2P.sqlite"];
NSLog(@"沙盒地址: %@~~~~~~~",sqlFilePath);
// 1.打开数据
// sqlite3 *db; // 一个db就代表一个数据库
// open会先判断数据库文件是否存在, 如果不存在会自动创建数据库文件, 然后再打开数据
// open会返回一个int类型的值, 这个值代表着打开数据库是否成功
int result = sqlite3_open(sqlFilePath.UTF8String, &_db);
if (SQLITE_OK == result) {
NSLog(@"数据库打开成功");
// 2.创建表
const char *sql = "CREATE TABLE IF NOT EXISTS t_MobP2P (id INTEGER PRIMARY KEY AUTOINCREMENT, lat TEXT, lon TEXT, phone TEXT, dateTime TEXT, status REAL DEFAULT 1);";
// NSMutableString *sql =
// [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS T_LittlePoint-1m( \n"];
// [sql appendString:@"id INTEGER PRIMARY KEY AUTOINCREMENT, \n"];
// // [sql appendString:@"name TEXT, \n"];
// [sql appendString:@"RSSI INTEGER \n"];
// [sql appendString:@"); \n"];
//
// const char *csql = [sql UTF8String];
char *error;
/*
第1参数:需要执行sql语句的数据库
第2参数:需要执行的sql语句
第3参数:执行完sql语句之后的回调方法
第4参数:回调方法的参数
第5参数:错误信息
*/
sqlite3_exec(_db, sql, NULL, NULL, &error);
if (error) {
NSLog(@"创建表失败");
}else
{
NSLog(@"创建表成功");
}
}else
{
NSLog(@"数据库打开失败");
}
}
-
3.插入数据的封装
/** * 插入数据(可根据实际情况修改) */ - (void)insertDataToSQliteWithLat:(NSString *)lat Lon:(NSString *)lon Phone:(NSString *)Phone DateTime:(NSString *)DateTime Status:(int)status { NSString *sql = @"INSERT INTO t_MobP2P(lat,lon,phone,dateTime,status) VALUES (?,?,?,?,?);"; sqlite3_stmt *stmt = nil; int result = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, nil); if (result == SQLITE_OK) { NSLog(@"数据库添加成功"); sqlite3_bind_text(stmt, 1, lat.UTF8String, -1, NULL); sqlite3_bind_text(stmt, 2, lon.UTF8String, -1, NULL); sqlite3_bind_text(stmt, 3, @"998".UTF8String, -1, NULL); sqlite3_bind_text(stmt, 4, DateTime.UTF8String, -1, NULL); sqlite3_bind_int(stmt, 5, 1); // 单步执行 sqlite3_step(stmt); }else{ NSLog(@"数据库添加失败 :%d",result); } // 释放跟随指针占用的内存 sqlite3_finalize(stmt); }
-
查询数据的封装(User 是存放数据的类)
/** * 查询数据 */ - (void)SearchDataFromTable { //2.创建跟随指针 sqlite3_stmt *stmt = nil; //3.准备sql语句 NSString *sql = @"SELECT * FROM t_MobP2P"; int result = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL); NSLog(@"%d````````", result); if (result == SQLITE_OK) { //创建可变数组,用来存放查询到的数据 NSMutableArray *array = [NSMutableArray array]; while (sqlite3_step(stmt) == SQLITE_ROW) { //根据sql语句,将搜索到的符合条件的值取出来 //0代表数据库表的第一列 // const char *sql = "CREATE TABLE IF NOT EXISTS t_MobP2P (id INTEGER PRIMARY KEY AUTOINCREMENT, lat TEXT, lon TEXT, phone TEXT, dateTime TEXT, status REAL DEFAULT 1);"; // NSString *lat = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 1)]; NSString *lon = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)]; NSString *phone = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 3)]; NSString *dataTime = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 4)]; int status = sqlite3_column_int(stmt, 5); User *use = [[User alloc] init]; use.lat = lat; use.lon = lon; use.phone = phone; use.dateTime = dataTime; use.status = status; [array addObject:use]; } NSLog(@"%@###########~~", array); //释放 sqlite3_finalize(stmt); User *user = [array lastObject]; NSLog(@"%@, %@, %@````", user.lat, user.lon, user.dateTime); // 在这里上传user的信息到服务器 if ([user.lat isEqualToString:@"0.000000"] && [user.lon isEqualToString:@"0.000000"]) { NSLog(@"用户一直没有登录过"); return; }else { // 在这里上传user的信息到服务器 } } }
5. 具体使用
-
- 导入头文件
#import "CJSQlite.h"
- 导入头文件
- 使用时创建单例对象
CJSQlite *CJLite = [CJSQlite sharedCJSQlite];
- 在合适地方打开数据库并创建表格
[CJLite creatSQLiteTable];
- 在合适的地方插入数据
[CJLite insertDataToSQliteWithLat:latStr Lon:lonStr Phone:iPhoneNum DateTime:[self getDate] Status:1];
- 查询数据(获取数据), 这里有需要说明的地方, 如果你想执行查询数据时, 或者插入数据, 都是需要先打开数据库,这个操作是不能少的, 所以, 如果你想查询数据 , 仍然需要调用打开数据库的代码
// 打开数据库
[CJLite creatSQLiteTable];
// 查询数据
[CJLite SearchDataFromTable];