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 -- 遇到特殊符号(\000,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 -- 遇到特殊符号(\000,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
时间: 2024-10-14 21:35:15

UI进阶 数据库 SQLite的相关文章

【Anroid进阶】SQLite数据库使用完全详解

在Android开发中,我们一般可以使用文件.sharedpreferences.以及数据库来保存我们程序运行中产生的数据,本篇主要讲解如何使用SQLite数据库,完成数据的增删改查的一般操作 SQLite介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它. SQLite 和其他的主要 SQL 数据库没什么区别.它的优点就是高效,Android 运行时环境包含了完整的 SQLite. SQLite 和其他

ios UI数据库 sqlite小型数据库的增、删、改、查、排序

#import "table.h" @implementation table // 1.创建表 每一列之间用',',如果存在就不创建 create table if not exists t_class( class_id integer primary key autoincrement, class_name varchar, person_count integer default 0) // 1.1// 删除表 drop table if exists t_person //

IOS开发-UI学习-sqlite数据库的操作

IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快,在ios和安卓app中常用来完成对数据进行离线缓存的处理,如新闻数据的离线缓存. 它的基本操作步骤是: 1.先加入sqlite开发库libsqlite3.dylib, 2.新建或打开数据库, 3.创建数据表, 4.插入数据, 5.查询数据并打印, 6.关闭数据库, 具体操作步

UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天

这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 1 #pragma mark - 管理好友 2 // 获取管理好友的单例对象 3 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; 4 // 用管理好友的单例对象初始化Roster花名册 5 // 好友操

Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题

做一个需要嵌入式数据库Sqlite 的unity3d项目,在pc机上运行良好,需要发布到Android平台上,于是,各种坑爹...会遇到找不到数据库文件的问题.当在pc机上使用sqlite时,当执行SqliteConnection dbConnection = new SqliteConnection("data source = test.db");语句时,如果有这个数据库文件则建立连接,如果没有则创建出这个文件,然后建立连接.当在Android平台上时,扯淡的事情就开始了,总之便不

Android - 插入数据库(SQLite)错误

插入数据库(SQLite)错误 本文地址: http://blog.csdn.net/caroline_wendy Error: android.database.sqlite.SQLiteException: no such table: step (code 1): ,  while compiling: INSERT INTO step(duration,date,counter) VALUES (?,?,?). 错误:插入数据库错误,没有找到表,插入表的地方写入参数,而参数地方传入空值.

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

Qt数据库(sqlite) — 总结

#include <QtSql>QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类 封装数据库所有记录 第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  采用QSQLITE数据库,QMYSQL数据库有问题?db.setHostName("localhost"); //设置数据库主机名

UI进阶 XML解析适配 &#39;libxml/tree.h&#39;file not found 错误解决办法

Xcode 'libxml/tree.h'file not found 错误解决办法 在工程的"Build Settings"页中找到"Header Search Path"项,添加"/usr/include/libxml2".在"Other Linker Flags"项,添加"-lxml2" UI进阶 XML解析适配 'libxml/tree.h'file not found 错误解决办法