首页 / SQLITE / UI进阶 数据库 SQLite
UI进阶 数据库 SQLite
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了UI进阶 数据库 SQLite,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9228字,纯文字阅读大概需要14分钟。
内容图文
![UI进阶 数据库 SQLite](/upload/InfoBanner/zyjiaocheng/1121/9d76af7796c4418ba2af2835cd1f58a5.jpg)
1、数据库管理系统
SQL:SQL是Structured Query Language(结构化查询语言)的缩写。
SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
-
常见的数据库管理系统
-
MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐。
- Oracle:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。系统可移植性好、使用方便、功能强,使用需要付费。
-
MySQL:MySQL是一个精巧的SQL数据库管理系统,而且是开源的数据管理系统。MySQL 主要目标是快速、健壮和易用。由于它的强大功能、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐。
-
数据库特征
- 以一定的方式存储在一起
- 能多用户共享
- 具有尽可能少的冗余代码 (单表操作的代码相对简单,多表联合操作的代码比较复杂)
- 与程序彼此独立的数据集合
-
什么是数据库
-
数据库(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框架步骤
-
-
引入<sqlite3.h>头文件
-
打开数据库
-
执行SQL命令(建表,增删改查)
-
关闭数据库
-
1 #import " DataBaseHandle.h " 2 // 引用库文件使用尖括号 3 #import <sqlite3.h> 4 5@interface DataBaseHandle () 6/// 声明一个属性,存储数据库路径 7 @property (nonatomic, copy) NSString *dbPath; 8 9@end 10 11static DataBaseHandle *dataBaseHandle = nil; 12 13 14@implementation DataBaseHandle 15 16// 单例 17 + (instancetype)shareDataBaseHandle { 18if (dataBaseHandle == nil) { 19 dataBaseHandle = [[DataBaseHandle alloc] init]; 20 } 21return dataBaseHandle; 22} 23 24// 懒加载 25 - (NSString *)dbPath { 26if (_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 33return _dbPath; 34} 35 36// 打开数据库 37// 好多地方都会使用到数据库,所以初始化一个数据库的静态变量 38static sqlite3 *db = nil; 39 40 - (void)openDataBase { 41// 如果数据库已经打开 42if (db != nil) { 43 NSLog(@"数据库已经打开"); 44return; 45 } 46// 打开数据库,并创建一个整型变量(枚举值)去接收打开的结果 47// 第一个参数:filename代表数据库的存储路径,需要进行编码 48// 第二个参数:**ppDB 二级指针(指针的地址),代表数据库的地址 49// sqlite3_open的返回值为枚举类型 50int result = sqlite3_open([self.dbPath UTF8String], &db); 51if (result == SQLITE_OK) { 52 NSLog(@"数据库打开成功"); 53 } else { 54 NSLog(@"数据库打开失败"); 55 } 56} 57 58// 关闭数据库 59 - (void)closeDataBase { 60// 参数为数据库 61int result = sqlite3_close(db); 62if (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// 第五个参数:错误信息 89int result = sqlite3_exec(db, [createSql UTF8String], NULL, NULL, NULL); 90if (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 (?,?,?)"; 105106// 2.创建伴随指针(用于获取sql语句,绑定参数和获取数据)107 sqlite3_stmt *stmt = NULL; 108109// 3.预执行 110// 第一个参数:数据库 111// 第二个参数:编码过的sql语句, 在OC代码中使用C语言的相关内容,要进行编码 112// 第三个参数:有正负之分, 如果为正,例如1 -- 只往后读一个字节, 如果为负,例如-1 -- 遇到特殊符号(\000,u000)才会结束 113// 第四个参数:伴随指针,会伴随着数据库的相关操作,确定其中?的值 114// 第五个参数:取值的时候取不全,剩下的值都存在这里115int result = sqlite3_prepare(db, insertSql.UTF8String, -1, &stmt, NULL); 116if (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.单步执行伴随指针129if (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} 140141// 通过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.预编译148int result = sqlite3_prepare(db, updataSql.UTF8String, -1, &stmt, NULL); 149if (result == SQLITE_OK) { 150// 4.绑定参数151 sqlite3_bind_int64(stmt, 1, uid); 152// 5.执行153if (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} 164165// 通过uid删除数据166 - (void)deleteWithUID:(NSInteger)uid { 167168 NSString *deleteSql = [NSString stringWithFormat:@"delete from person where uid = %ld", uid]; 169int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL); 170if (result == SQLITE_OK) { 171 NSLog(@"删除成功"); 172 } else { 173 NSLog(@"%d",result); 174 } 175176} 177178// 通过name删除数据179 - (void)deleteWithName:(NSString *)name { 180181 NSString *deleteSql = [NSString stringWithFormat:@"delete from person where name = ‘%@‘", name]; 182int result = sqlite3_exec(db, deleteSql.UTF8String, NULL, NULL, NULL); 183if (result == SQLITE_OK) { 184 NSLog(@"删除成功"); 185 } else { 186 NSLog(@"%d",result); 187 } 188} 189190// 查找所有数据191 - (void)searchAll { 192// 1.准备sql语句193 NSString *selectSql = @"select * from person"; 194// 2.伴随指针195 sqlite3_stmt *stmt = NULL; 196// 3.预执行197int result = sqlite3_prepare(db, selectSql.UTF8String, -1, &stmt, NULL); 198if (result == SQLITE_OK) { 199// 4、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE200while (sqlite3_step(stmt) == SQLITE_ROW) { 201// 第一个参数:伴随指针 202// 第二个参数:当前字段在第几列(sql语句中写的要查找的字段),从0开始203int uid = sqlite3_column_int(stmt, 0); 204 NSString *name = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 1)]; 205 NSString *gender = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 2)]; 206int 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} 215216// 根据姓名查找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.预执行223int result = sqlite3_prepare(db, selectSql.UTF8String, -1, &stmt, NULL); 224if (result == SQLITE_OK) { 225// 4.绑定参数226 sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); 227// 5、单步执行sql语句,当到达结果集末尾时则返回值为SQLITE_DONE228while (sqlite3_step(stmt) == SQLITE_ROW) { 229// 第一个参数:伴随指针 230// 第二个参数:当前字段在第几列,从0开始231int uid = sqlite3_column_int(stmt, 1); 232// NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];233 NSString *gender = [NSString stringWithUTF8String:(constchar *)sqlite3_column_text(stmt, 2)]; 234int 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} 243244@end
-
原文:http://www.cnblogs.com/fearlessyyp/p/5469103.html
内容总结
以上是互联网集市为您收集整理的UI进阶 数据库 SQLite全部内容,希望文章能够帮你解决UI进阶 数据库 SQLite所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。