zoukankan      html  css  js  c++  java
  • SQL

     1 #import "ViewController.h"
     2 #import <sqlite3.h>
     3 #import "DataBaseManager.h"
     4 @interface ViewController ()
     5 
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     /*
    13     //获取documents的路径
    14     NSString *doctmentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    15     //创建数据库路径
    16     NSString *sqlPath = [doctmentsPath stringByAppendingPathComponent:@"student.sqlite"];
    17     
    18     //打开数据库,将文件路径转化为char类型的,二阶指针是指针的地址
    19     //数据库指针sqlite3
    20 #warning 二阶指针 db
    21     sqlite3 *db = nil;
    22     NSLog(@"%p",db);
    23     sqlite3_open(sqlPath.UTF8String, &db);
    24     NSLog(@"%p",db);
    25     
    26     //创建stu表,包含字段s_id,s_name,s_age
    27     NSString *sqlStr = @"create table if not exists stu (s_id integer primary key,s_name text ,s_age integer)";
    28     //通过result接受执行结果
    29     int result = sqlite3_exec(db, sqlStr.UTF8String, NULL, NULL, NULL);
    30     
    31     NSLog(@"%@",result == SQLITE_OK ? @"建表成功":@"建表失败");
    32     NSLog(@"%@",sqlPath);
    33     
    34     //插入数据insert into
    35     NSString *insertSql = @"insert into stu (s_name,s_age) values ('zhangsan',20)";
    36     int resultInsert = sqlite3_exec(db, insertSql.UTF8String, NULL, NULL, NULL);
    37     NSLog(@"%@",resultInsert == SQLITE_OK ? @"插入成功":@"插入失败");
    38     
    39     //更改数据
    40     NSString *upSql = @"update stu set s_age = 100 where s_age = 20";
    41     int resultUpData = sqlite3_exec(db, upSql.UTF8String, NULL, NULL, NULL);
    42     NSLog(@"%@",resultUpData == SQLITE_OK ? @"更改成功":@"更改失败");
    43     
    44     //删除数据
    45     
    46     NSString *deleteSql = @"delete from stu";
    47     int deleteResult = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
    48     NSLog(@"%@",deleteResult == SQLITE_OK ? @"删除成功":@"删除失败");
    49     
    50     //关闭数据库
    51     int closeResult = sqlite3_close(db);
    52     NSLog(@"%@",closeResult == SQLITE_OK ? @"关闭成功":@"关闭失败");
    53     */
    54     
    55     
    56     DataBaseManager *dbManager = [DataBaseManager shareInstance];
    57     //使用自定义DataBaseManager,进行数据库操作
    58     //打开数据库
    59     [dbManager openDB];
    60     //创建表
    61     [dbManager createTable];
    62     [dbManager insertName:@"张全蛋" Age:20];
    63     
    64     NSArray *stuArray =[dbManager selectAll];
    65     NSLog(@"%@",stuArray);
    66     NSArray *nameArray = [dbManager selectWithName:@"张全蛋"];
    67     NSLog(@"张全蛋%@",nameArray);
    68     [dbManager closeDBm];
    69     
    70     
    71 }
     1 #import <Foundation/Foundation.h>
     2 
     3 @interface DataBaseManager : NSObject
     4 //单例
     5 +(instancetype)shareInstance;
     6 //打开数据库
     7 -(void)openDB;
     8 //创建表
     9 -(void)createTable;
    10 //插入数据
    11 -(void)insertName:(NSString *)name Age:(NSInteger) age;
    12 //删除数据
    13 -(void)deleteWithName:(NSString *)name;
    14 //更新数据
    15 -(void)updateTable;
    16 //查询数据
    17 -(NSArray *)selectAll;
    18 -(NSArray *)selectWithName:(NSString *)name;
    19 //关闭数据库
    20 -(void)closeDBm;
    21 @end
      1 #import "DataBaseManager.h"
      2 #import <sqlite3.h>
      3 @interface DataBaseManager()
      4 //数据库路径
      5 @property (nonatomic,copy)NSString *sqlPath;
      6 
      7 @end
      8 
      9 @implementation DataBaseManager
     10 //单例
     11 +(instancetype)shareInstance
     12 {
     13     static DataBaseManager *manager = nil;
     14     //两种方式创建单例
     15     //1.这种方式在工程的整个生命周期只被执行一次,一直到工程关闭被释放
     16     static dispatch_once_t onceToken;
     17     dispatch_once(&onceToken,^{
     18         manager = [[DataBaseManager alloc] init];
     19     });
     20 //    //2.第二种方法
     21 //    if (manager == nil) {
     22 //        manager = [[DataBaseManager alloc] init];
     23 //    }
     24     return manager;
     25 }
     26 //重写getter方法
     27 -(NSString *)sqlPath
     28 {
     29     //if判断避免每次都进行创建
     30     if (_sqlPath == nil) {
     31         _sqlPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"student.sqlite"];
     32     }
     33     return _sqlPath;
     34 }
     35 //由于数据库的表指针全局都要用,所以定义为全局变量
     36 static sqlite3 *db = nil;
     37 //打开数据库
     38 -(void)openDB
     39 {
     40 #warning 如果sqlPath写成实例变量的形式则不会走getter方法,
     41     int result = sqlite3_open(self.sqlPath.UTF8String, &db);
     42     NSLog(@"%@",result == SQLITE_OK ?@"打开成功":@"打开失败");
     43 }
     44 //创建表
     45 -(void)createTable
     46 {
     47     //创建表的SQL
     48 #warning 要把类型放前边,约束放后边 如果把主键约束放前边,integer放后边会出错.
     49     NSString *sqlString = @"create table if not exists stu(s_id integer primary key  autoincrement,s_name text,s_age integer)";
     50     //执行SQL
     51     int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
     52     NSLog(@"%@", result == SQLITE_OK ?@"建表成功": @"建表失败");
     53 }
     54 //插入数据
     55 -(void)insertName:(NSString *)name Age:(NSInteger) age;
     56 {
     57     NSString *sqlString = [NSString stringWithFormat:@"insert into stu (s_name,s_age) values ('%@','%ld')",name,age];
     58     int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
     59     NSLog(@"%@", result == SQLITE_OK ?@"插入成功": @"插入失败");
     60 }
     61 //删除数据
     62 -(void)deleteWithName:(NSString *)name
     63 {
     64     NSString *sqlString = [NSString stringWithFormat:@"delete from stu where s_name = '%@'",name];
     65     int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
     66     NSLog(@"%@", result == SQLITE_OK ?@"删除成功": @"删除失败");
     67 }
     68 //更新数据
     69 -(void)updateTable
     70 {
     71     NSString *sqlString = @"updata stu set s_age = 10 ";
     72     int result = sqlite3_exec(db, sqlString.UTF8String, NULL, NULL, NULL);
     73     NSLog(@"%@", result == SQLITE_OK ?@"更新成功": @"更新失败");
     74     
     75 }
     76 
     77 //查询数据
     78 -(NSArray *)selectAll
     79 {
     80     NSMutableArray *array =[NSMutableArray new];
     81     //查询SQL语句
     82     NSString *sqlString = @"select * from stu";
     83     //执行查询
     84     
     85     //stmt伴随指针
     86     sqlite3_stmt *stmt = nil;
     87     //先创建伴随指针,再进行预执行,stmt指向的是step将要执行的语句
     88     int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
     89     if (result == SQLITE_OK) {
     90         //预执行成功,条件循环取出所有数据
     91         while (sqlite3_step(stmt) == SQLITE_ROW) {
     92             //第二个参数是指第几列
     93             NSInteger s_id = sqlite3_column_int(stmt, 0);
     94             //NSString *name = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 1)];
     95             //上面的写法报黄,下面的写法没问题
     96             NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
     97             
     98             NSInteger age = sqlite3_column_int(stmt, 2);
     99             //由于s_id,age不是对象类型的,所以需要用@()这种形式强转
    100             NSDictionary *studentDic = [NSDictionary dictionaryWithObjectsAndKeys:@(s_id),@"s_id",name,@"s_name",@(age),@"s_age", nil];
    101             [array addObject:studentDic];
    102         }
    103         //释放伴随指针
    104         sqlite3_finalize(stmt);
    105         //返回数组
    106         return array;
    107     }
    108     
    109     return nil;
    110 }
    111 -(NSArray *)selectWithName:(NSString *)name
    112 {
    113     NSMutableArray *array = [NSMutableArray array];
    114     //SQL语句
    115     NSString *sqlString = @"select * from stu where s_name = ?";
    116     //预执行
    117     //伴随指针
    118     sqlite3_stmt *stmt = nil;
    119     int result = sqlite3_prepare(db, sqlString.UTF8String, -1, &stmt, NULL);
    120     if (result == SQLITE_OK) {
    121         //预执行成功,绑定参数 bind
    122         //sqlite3_column查询获得数据,列数从0开始
    123         //第二个参数:sqilit3_bind_绑定参数,表示参数所在的列,第三个参数是绑定的参数
    124         sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
    125         while (sqlite3_step(stmt) == SQLITE_ROW) {
    126             //第二个参数是指第几列
    127             NSInteger s_id = sqlite3_column_int(stmt, 0);
    128             //NSString *name = [NSString stringWithUTF8String:sqlite3_column_text(stmt, 1)];
    129             //上面的写法报黄,下面的写法没问题
    130             NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
    131             
    132             NSInteger age = sqlite3_column_int(stmt, 2);
    133             //由于s_id,age不是对象类型的,所以需要用@()这种形式强转
    134             NSDictionary *studentDic = [NSDictionary dictionaryWithObjectsAndKeys:@(s_id),@"s_id",name,@"s_name",@(age),@"s_age", nil];
    135             [array addObject:studentDic];
    136         }
    137         
    138     }
    139     //释放伴随指针
    140     sqlite3_finalize(stmt);
    141     return array;
    142 }
    143 //关闭数据库
    144 -(void)closeDBm
    145 {
    146     int result = sqlite3_close(db);
    147     NSLog(@"%@", result == SQLITE_OK ?@"关闭成功": @"关闭失败");
    148 
    149 }
    150 @end
  • 相关阅读:
    【LeetCode】-- 73. Set Matrix Zeroes
    (第三场) A PACM Team 【dp,五维背包】
    POJ 1745 【0/1 背包】
    (第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】
    POJ 2299 【树状数组 离散化】
    树状数组 && 线段树应用 -- 求逆序数
    HDU 1698 【线段树,区间修改 + 维护区间和】
    HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
    (第二场)D Money 【dp贪心】
    (第二场)A Run 【动态规划】
  • 原文地址:https://www.cnblogs.com/DevinSMR/p/5267112.html
Copyright © 2011-2022 走看看