SQLite数据插入和获取封装

由于新公司目前只用到这两个功能, 所以我自己也就只封装了这两个功能而已
如果以后加入的话, 会继续更新, 封装文件CJSQlite

首先是, 创建表格

我把整个数据库的插入和获取功能都写到了CJSQlite这个类中

打开数据库并创建表格:

我之前的文章已经有简单的写到怎样创建表格, 蓝牙4.0 测试与数据的存储(SQLite), 这里再讲解一下

1. 配置数据库,libsqlite3.tdb框架,具体位置如下:

SQLite数据插入和获取封装_第1张图片

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);
    
      }
    
  1. 查询数据的封装(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. 具体使用

    1. 导入头文件
      #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];

你可能感兴趣的:(SQLite数据插入和获取封装)