zoukankan      html  css  js  c++  java
  • UI进阶 数据库 SQLite

    1、数据库管理系统

      SQL:SQL是Structured Query Language(结构化查询语言)的缩写。

      SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。

    • 常见的数据库管理系统

      • MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐。

      • Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强,使用需要付费
    • 数据库特征

      • 以一定的方式存储在一起
      • 能多用户共享
      • 具有尽可能少的冗余代码(单表操作的代码相对简单,多表联合操作的代码比较复杂)
      • 与程序彼此独立的数据集合
    • 什么是数据库

      • 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

    • 数据库分类

      • 关系型数据库(主流)、对象型数据库、层次式数据库

    • 常用关系型数据库

      • PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase

        嵌入式移动客户端:SQLite

    • SQLite

      • SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,它占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。iOS 使用时SQLite,只需要加入 libsqlite3.0.tbd依赖以及引入 sqlite3.h 头文件即可。 

      • SQLite数据库数据类型

        • SQLite是无类型的数据库,可以保存任何类型的数据,对于SQLite来说对字段不指定类型是完全有效的.

          (注:良好的编程习惯应该要为字段标注类型)

        • 为了使sqlite和其他数据库间的兼容性最大化,sqlite支持“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。

          1). 如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。

          2). 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。

          3). 如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。

          4). 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型是REAL。

          5). 其余情况下,字段的亲缘类型为NUMERIC。

           

    • 数据库结构

      • 表:是数据库中一个非常重要的对象,是其他对象的基础。根据信息的分类情况,一个数据库中可能包含若干个数据表。

      • 字段:表的“列”称为“字段” ,每个字段包含某一专题的信息。

      • 记录:是指对应于数据表中一行信息的一组完整的相关信息。

    2、 SQL语句

    • NOT NULL - 非空数据库中允许除主键以外其他任何字段为空
    • UNIQUE - 唯一表示该字段中不能有重复的值
    • PRIMARY KEY - 主键非空且唯一,一个表里可以没有主键,但是如果设置了主键,主键非空且不重复(建议设置主键,方便查找表中数据)
    • FOREIGN KEY - 外键用于联表查询,简单的理解:一个表中的外键指向另外一个表的主键,外键可以重复。
      CHECK - 条件检查确保一列中的所有值满足一定条件
      • 作用:用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的主键值之一

    • DEFAULT - 默认如果没有设置值,将会添加默认值到该字段
    • AUTOINCREMENT-自增型变量当设置一个类型为integer的字段为自增型变量时,每次插入新纪录时,会自动创建该字段的值,默认开始值为1,每条递增加1。一般主键设置为自增型变量
    • 创建表

      • 语法:

        create table if not exists 表名(字段1 字段类型 约束1 约束2,字段2 字段类型 约束); 
        if not exists 表示如果表不存在的情况下,再创建表,可以省略

      • 示例

        需求:创建一个student表,表中的字段有学号,姓名,年龄,学号作为主键,自增,不能为空;姓名默认为'无名氏';年龄大于16岁

        create table if not exists student(s_id integer primary key autoincrement not null, s_name text default '无名氏', s_age integer check(s_age > 16));

    • 插入数据

      • 语法:

        insert into 表名(字段1,字段2)values(字段1值,字段2值);

      • 示例

        需求:插入一个学生,姓名'Mary',年龄 18

        insert into student(s_name,s_age)values('Mary',18);

    • 更新

      • 语法:

        update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2 where 条件;

      •  示例

        update student set s_age = 25, s_name = 'Tom' where s_name = 'Mary';

    • 删除
      • 语法:

        delete from 表名 where 条件;

      • 示例

        需求:删除年龄为10的学生

        delete from student where s_age = 10;

    • 查询数据
      • 语法:

        select 字段 from 表名 where 条件;

      • // 示例

        select * from student where s_name = 'Tom';

    3、iOS的数据库技术的实现

    Linux 系统级的SQLite 技术实现框架

    Xcode 6中  libsqlite3.0.dylib 

    Xcode 7中  libsqlite3.0.tbd 

    添加libsqlite3.0.tbd框架步骤

     

     

      1. 引入<sqlite3.h>头文件

      2. 打开数据库

      3. 执行SQL命令(建表,增删改查)

      4. 关闭数据库

      5.   1 #import "DataBaseHandle.h"
          2 // 引用库文件使用尖括号
          3 #import <sqlite3.h>
          4 
          5 @interface DataBaseHandle ()
          6 /// 声明一个属性,存储数据库路径
          7 @property (nonatomic, copy) NSString *dbPath;
          8 
          9 @end
         10 
         11 static DataBaseHandle *dataBaseHandle = nil;
         12 
         13 
         14 @implementation DataBaseHandle
         15 
         16 // 单例
         17 + (instancetype)shareDataBaseHandle {
         18     if (dataBaseHandle == nil) {
         19         dataBaseHandle = [[DataBaseHandle alloc] init];
         20     }
         21     return dataBaseHandle;
         22 }
         23 
         24 // 懒加载
         25 - (NSString *)dbPath {
         26     if (_dbPath == nil) {
         27         // 数据库存在Documents文件夹下的person.sqlite中
         28         NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
         29         _dbPath = [documentsPath stringByAppendingPathComponent:@"person.sqlite"];
         30         NSLog(@"%@", documentsPath);
         31     }
         32     
         33     return _dbPath;
         34 }
         35 
         36 // 打开数据库
         37 // 好多地方都会使用到数据库,所以初始化一个数据库的静态变量
         38 static sqlite3 *db = nil;
         39 
         40 - (void)openDataBase {
         41     // 如果数据库已经打开
         42     if (db != nil) {
         43         NSLog(@"数据库已经打开");
         44         return;
         45     }
         46     // 打开数据库,并创建一个整型变量(枚举值)去接收打开的结果
         47     // 第一个参数:filename代表数据库的存储路径,需要进行编码
         48     // 第二个参数:**ppDB 二级指针(指针的地址),代表数据库的地址
         49     // sqlite3_open的返回值为枚举类型
         50     int result = sqlite3_open([self.dbPath UTF8String], &db);
         51     if (result == SQLITE_OK) {
         52         NSLog(@"数据库打开成功");
         53     } else {
         54         NSLog(@"数据库打开失败");
         55     }
         56 }
         57 
         58 // 关闭数据库
         59 - (void)closeDataBase {
         60     // 参数为数据库
         61     int result = sqlite3_close(db);
         62     if (result == SQLITE_OK) {
         63         NSLog(@"数据库关闭成功");
         64     } else {
         65         NSLog(@"数据库关闭失败");
         66     }
         67     db = nil;
         68 }
         69 
         70 // 新建表
         71 - (void)createTable {
         72     /**
         73      *  创建一个person表,
         74      字段:
         75      uid integer类型 主键 自增 不能为空
         76      name text类型
         77      gender text类型
         78      age integer类型
         79      */
         80     // 1.创建一个字符串,存放创建表的sql语句
         81     NSString *createSql = @"create table if not exists person(uid integer primary key autoincrement not null, name text, gender text, age integer)";
         82     // 创建person表
         83     // 2.sqlite3_exec()可以执行任何sql语句,比如创建表,更新,插入和删除操作.但是一般不用它执行查询语句,因为它不会返回查询到的数据
         84     // 第一个参数:数据库
         85     // 第二个参数:编码过的sql语句
         86     // 第三个参数:结果回调的函数
         87     // 第四个参数:回调函数的参数
         88     // 第五个参数:错误信息
         89     int result = sqlite3_exec(db, [createSql UTF8String], NULL, NULL, NULL);
         90     if (result == SQLITE_OK) {
         91         NSLog(@"person表创建成功");
         92     } else {
         93         NSLog(@"person表创建失败");
         94     }
         95     // 打印数据库对的路径,检查表是否创建成功
         96     NSLog(@"%@", self.dbPath);
         97 }
         98 
         99 // 插入数据
        100 - (void)insertName:(NSString *)name
        101             gender:(NSString *)gender
        102                age:(NSInteger)age {
        103     // 1.准备sql语句,当values不确定的情况下使用?代替,之后会进行其值的绑定过程
        104     NSString *insertSql = @"insert into person(name,gender,age) values (?,?,?)";
        105     
        106     // 2.创建伴随指针(用于获取sql语句,绑定参数和获取数据)
        107     sqlite3_stmt *stmt = NULL;
        108     
        109     // 3.预执行
        110     // 第一个参数:数据库
        111     // 第二个参数:编码过的sql语句, 在OC代码中使用C语言的相关内容,要进行编码
        112     // 第三个参数:有正负之分, 如果为正,例如1 -- 只往后读一个字节,  如果为负,例如-1 -- 遇到特殊符号(00,u000)才会结束
        113     // 第四个参数:伴随指针,会伴随着数据库的相关操作,确定其中?的值
        114     // 第五个参数:取值的时候取不全,剩下的值都存在这里
        115     int result = sqlite3_prepare(db, insertSql.UTF8String, -1, &stmt, NULL);
        116     if (result == SQLITE_OK) {
        117         // 4.如果操作成功,进行?值的绑定
        118         // 第一个参数:伴随指针
        119         // 第二个参数:?的位置,从1开始
        120         // 第三个参数:要绑定的值,如果是字符串,需要进行编码
        121         // 第四个参数:有正负之分, 如果为正,例如1 -- 只往后读一个字节,  如果为负,例如-1 -- 遇到特殊符号(00,u000)才会结束
        122         // 第五个参数:回调函数
        123         sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        124         sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);
        125         // age是integer类型的数据,需要用int64这个方法
        126         sqlite3_bind_int64(stmt, 3, age);
        127         // sql语句执行完毕
        128         // 5.单步执行伴随指针
        129         if (sqlite3_step(stmt) == SQLITE_DONE) {
        130             NSLog(@"数据插入成功");
        131         } else {
        132             NSLog(@"数据插入失败");
        133         }
        134     } else {
        135         NSLog(@"result = %d", result);
        136     }
        137     // 6.关闭伴随指针,释放内存
        138     sqlite3_finalize(stmt);
        139 }
        140 
        141 // 通过uid更新数据
        142 - (void)updateWithUID:(NSInteger)uid {
        143     // 1.准备sql语句
        144     NSString *updataSql = @"update person set name = '二芳' where uid = ?";
        145     // 2.创建伴随指针
        146     sqlite3_stmt *stmt = NULL;
        147     // 3.预编译
        148     int result = sqlite3_prepare(db, updataSql.UTF8String, -1, &stmt, NULL);
        149     if (result == SQLITE_OK) {
        150         // 4.绑定参数
        151         sqlite3_bind_int64(stmt, 1, uid);
        152         // 5.执行
        153         if (sqlite3_step(stmt) == SQLITE_DONE) {
        154             NSLog(@"更新成功");
        155         } else {
        156             NSLog(@"更新失败");
        157         }
        158     } else {
        159         NSLog(@"result = %d", result);
        160     }
        161     // 6.关闭伴随指针
        162     sqlite3_finalize(stmt);
        163 }
        164 
        165 // 通过uid删除数据
        166 - (void)deleteWithUID:(NSInteger)uid {
        167     
        168     NSString *deleteSql = [NSString stringWithFormat:@"delete from person where uid = %ld", uid];
        169     int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
        170     if (result == SQLITE_OK) {
        171         NSLog(@"删除成功");
        172     } else {
        173         NSLog(@"%d",result);
        174     }
        175     
        176 }
        177 
        178 // 通过name删除数据
        179 - (void)deleteWithName:(NSString *)name {
        180     
        181     NSString *deleteSql = [NSString stringWithFormat:@"delete from person where name = '%@'", name];
        182     int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL);
        183     if (result == SQLITE_OK) {
        184         NSLog(@"删除成功");
        185     } else {
        186         NSLog(@"%d",result);
        187     }
        188 }
        189 
        190 // 查找所有数据
        191 - (void)searchAll {
        192     // 1.准备sql语句
        193     NSString *selectSql = @"select * from person";
        194     // 2.伴随指针
        195     sqlite3_stmt *stmt = NULL;
        196     // 3.预执行
        197     int result = sqlite3_prepare(db, selectSql.UTF8String, -1, &stmt, NULL);
        198     if (result == SQLITE_OK) {
        199         // 4、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE
        200         while (sqlite3_step(stmt) == SQLITE_ROW) {
        201             // 第一个参数:伴随指针
        202             // 第二个参数:当前字段在第几列(sql语句中写的要查找的字段),从0开始
        203             int uid = sqlite3_column_int(stmt, 0);
        204             NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
        205             NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
        206             int age = sqlite3_column_int(stmt, 3);
        207             NSLog(@"uid = %d,name = %@, gender = %@, age = %d", uid, name, gender, age);
        208         }
        209     } else {
        210         NSLog(@"查询失败");
        211     }
        212     // 5.关闭伴随指针
        213     sqlite3_finalize(stmt);
        214 }
        215 
        216 // 根据姓名查找
        217 - (void)searchWithName:(NSString *)name {
        218     // 1.准备sql语句
        219     NSString *selectSql = @"select age,uid,gender from person where name = ?";
        220     // 2.伴随指针
        221     sqlite3_stmt *stmt = NULL;
        222     // 3.预执行
        223     int result = sqlite3_prepare(db, selectSql.UTF8String, -1, &stmt, NULL);
        224     if (result == SQLITE_OK) {
        225         // 4.绑定参数
        226         sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
        227         // 5、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE
        228         while (sqlite3_step(stmt) == SQLITE_ROW) {
        229             // 第一个参数:伴随指针
        230             // 第二个参数:当前字段在第几列,从0开始
        231             int uid = sqlite3_column_int(stmt, 1);
        232 //            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
        233             NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
        234             int age = sqlite3_column_int(stmt, 0);
        235             NSLog(@"uid = %d,name = %@, gender = %@, age = %d", uid, name, gender, age);
        236         }
        237     } else {
        238         NSLog(@"查询失败");
        239     }
        240     // 6.关闭伴随指针
        241     sqlite3_finalize(stmt);
        242 }
        243 
        244 @end
  • 相关阅读:
    uNFS搭建
    nodejs+koa 后台框架结构、demo学习地址
    Apache 基本配置 代理 重定向 跨域 https ssl证书 在windows下常用命令
    新版 Mediasoup Windows 安装 编译
    腾讯云服务器,在本地域名不能访问,IP可以访问;端口访问差异:有的地方能访问有的不能
    nodejs 程序打包 打包 koa express 项目 源代码保护加密
    windows 设置修改本地 hosts 访问 github 快速访问 提高访问 github 速度
    Flutter开发 备用网站地址
    redis in windows
    CRLF和LF的差异
  • 原文地址:https://www.cnblogs.com/fearlessyyp/p/5469103.html
Copyright © 2011-2022 走看看