SQLite3的运用
1、导入库文件:libsqlite3。
2、.m文件的代码:
//
// ViewController.m
// SQLite3的运用
//
// Created by PengYunjing on 16/9/24.
// Copyright © 2016年 PYJ. All rights reserved.
// /**
* 说明:
* sqlite3 *ppDb, 数据库句柄,跟文件句柄FILE很类似
* sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
* sqlite3_open(), 打开数据库,没有数据库时创建。
* sqlite3_exec(), 执行非查询的sql语句
* sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
* sqlite3_close(), 关闭数据库文件
*
* 还有一系列的函数,用于从记录集字段中获取数据,如
* sqlite3_column_text(), 取text类型的数据。
* sqlite3_column_blob(), 取blob类型的数据
* sqlite3_column_int(), 取int类型的数据
*/ #import "ViewController.h"
#import <sqlite3.h> //设置数据库的路径
#define FileName [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"personinfo.sqlite"] @interface ViewController () @end @implementation ViewController
//设置句柄, 通过句柄对数据库进行操作
static sqlite3 *ppDb = nil; - (void)viewDidLoad {
[super viewDidLoad]; NSLog(@"%@", FileName); [self open];
} /** 创建一个独立的执行sql语句的方法,传入sql语句,就执行sql语句 */
-(void)execSql:(NSString *)sql { char *errmsg; //错误信息 if (sqlite3_exec(ppDb, [sql UTF8String], NULL, NULL, &errmsg) != SQLITE_OK) {
sqlite3_close(ppDb);
NSLog(@"数据库操作数据失败!");
} } /** 打开数据库(如果没有就会新建一个) */
- (void)open { //操作代码(sql)用来创建表格,注意要转换为c的字符串,结束处有 ; 符号
NSString *sql = @"create table if not exists personinfo (id integer primary key autoincrement,name text, age integer, address text);"; if (sqlite3_open([FileName UTF8String], &ppDb) == SQLITE_OK) { char *errmsg; //错误信息 //建表
sqlite3_exec(ppDb, [sql UTF8String], NULL, NULL, &errmsg);
if (errmsg) {
NSLog(@"建表失败 -- %s",errmsg);
} }else {
NSLog(@"打开数据库失败!");
} } /** 增 */
- (IBAction)insert { NSString *sql1 = [NSString stringWithFormat:@"insert into personinfo (name, age, address) values('%@', '%@', '%@');", @"赵一", @"", @"北京"];
NSString *sql2 = [NSString stringWithFormat:@"insert into personinfo (name, age, address) values('%@', '%@', '%@');", @"钱二", @"", @"上海"];
NSString *sql3 = [NSString stringWithFormat:@"insert into personinfo (name, age, address) values('%@', '%@', '%@');", @"张三", @"", @"广州"];
NSString *sql4 = [NSString stringWithFormat:@"insert into personinfo (name, age, address) values('%@', '%@', '%@');", @"李四", @"", @"深圳"];
NSString *sql5 = [NSString stringWithFormat:@"insert into personinfo (name, age, address) values('%@', '%@', '%@');", @"刘五", @"", @"北京"]; [self execSql:sql1];
[self execSql:sql2];
[self execSql:sql3];
[self execSql:sql4];
[self execSql:sql5]; } /** 删 */
- (IBAction)delete { //删除id 大于1 且 小于4 的数据
NSString *sql = @"delete from personinfo where id > 1 and id < 4;";
[self execSql:sql]; } /** 改 */
- (IBAction)update { //这里把id为“1”的”name”更改为 “Hello World”
NSString *sql = @"update personinfo set name = 'Hello World' where id = 1;";
[self execSql:sql]; } /** 查 */
- (IBAction)select { //打开数据库
[self open]; //查询所有信息
// NSString *sql = @"select * from personinfo;";
//按条件查询
// NSString *sql = @"select * from personinfo where age > 21 and age < 23;";
// NSString *sql = @"select * from personinfo where age between 20 and 22;";
// NSString *sql = @"select * from personinfo where address in ('北京', '深圳');";
NSString *sql = @"select * from personinfo where address in ('北京', '深圳') and age between 23 and 26;"; //查询的句柄,游标
sqlite3_stmt *stmt; if (sqlite3_prepare(ppDb, [sql UTF8String], -, &stmt, NULL) == SQLITE_OK) { //查询数据
while (sqlite3_step(stmt) == SQLITE_ROW) { /**
* 获取表数据的内容
* sqlite3_column_text('句柄',字段索引值。为char类型)
* sqlite3_column_int(int类型)
*/ NSString *name = [NSString stringWithCString:(const char *)sqlite3_column_text(stmt, ) encoding:NSUTF8StringEncoding];
int age = sqlite3_column_int(stmt, );
NSString *address = [NSString stringWithCString:(const char *)sqlite3_column_text(stmt, ) encoding:NSUTF8StringEncoding]; NSLog(@"name:%@, age:%d, address:%@", name, age, address); } } } @end
3、用Xcode运行代码,会产生一个"personinfo.sqlite"的文件,根据路径找到这个文件:
4、用SQLiteManager工具打开"personinfo.sqlite"(没有安装就自己去网上下载)
现在我们可以看到表格已经创建好了。
5、在模拟器点击调用“增”的方法之后,再在SQLiteManager工具菜单点击左上角“Data”,再点击“personinfo”:
我们终于可以看到数据了。
6、其他的代码注释的都很清楚,按照方法做就行了。
sqlite3 语句总结
一、
sqlite3长用于 轻量级的 数据存储,象单片机这一类,但是现在的sqlite3,已经很先进,不能小看
二、
sqlite3常用命令
当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识:
#sqlite3 test.db
查看数据库文件信息命令(注意命令前带字符'.'):
sqlite>.database
查看所有表的创建语句:
sqlite>.schema
查看指定表的创建语句:
sqlite>.schema table_name
以sql语句的形式列出表内容:
sqlite>.dump table_name
设置显示信息的分隔符:
sqlite>.separator symble
Example:设置显示信息以‘:’分隔
sqlite>.separator :
设置显示模式:
sqlite>.mode mode_name
Example:默认为list,设置为column,其他模式可通过.help查看mode相关内容
sqlite>.mode column
输出帮助信息:
sqlite>.help
设置每一列的显示宽度:
sqlite>.width width_value
Example:设置宽度为2
sqlite>.width 2
列出当前显示格式的配置:
sqlite>.show
退出sqlite终端命令:
sqlite>.quit
或
sqlite>.exit
3、sqlite3指令
sql的指令格式:所有sql指令都是以分号(;)结尾,两个减号(--)则表示注释。
如:
sqlite>create studen_table(Stu_no interger PRIMARY KEY, Name text NOT NULL, Id interger UNIQUE, Age interger CHECK(Age>6), School text DEFAULT 'xx小学);
该语句创建一个记录学生信息的数据表。
3.1 sqlite3存储数据的类型
NULL:标识一个NULL值
INTERGER:整数类型
REAL:浮点数
TEXT:字符串
BLOB:二进制数
3.2 sqlite3存储数据的约束条件
Sqlite常用约束条件如下:
PRIMARY KEY - 主键:
1)主键的值必须唯一,用于标识每一条记录,如学生的学号
2)主键同时也是一个索引,通过主键查找记录速度较快
3)主键如果是整数类型,该列的值可以自动增长
NOT NULL - 非空:
约束列记录不能为空,否则报错
UNIQUE - 唯一:
除主键外,约束其他列的数据的值唯一
CHECK - 条件检查:
约束该列的值必须符合条件才可存入
DEFAULT - 默认值:
列数据中的值基本都是一样的,这样的字段列可设为默认值
3.3 sqlite3常用指令
1)建立数据表
create table table_name(field1 type1, field2 type1, ...);
table_name是要创建数据表名称,fieldx是数据表内字段名称,typex则是字段类型。
例,建立一个简单的学生信息表,它包含学号与姓名等学生信息:
create table student_info(stu_no interger primary key, name text);
create table if not exists 表名(字段名1,字段名2...);
2)添加数据记录
insert into table_name(field1, field2, ...) values(val1, val2, ...);
valx为需要存入字段的值。
例,往学生信息表添加数据:
Insert into student_info(stu_no, name) values(0001, alex);
3)修改数据记录
update table_name set field1=val1, field2=val2 where expression;
where是sql语句中用于条件判断的命令,expression为判断表达式
例,修改学生信息表学号为0001的数据记录:
update student_info set stu_no=0001, name=hence where stu_no=0001;
4)删除数据记录
delete from table_name [where expression];
不加判断条件则清空表所有数据记录。
例,删除学生信息表学号为0001的数据记录:
delete from student_info where stu_no=0001;
5)查询数据记录
select指令基本格式:
select columns from table_name [where expression];
a查询输出所有数据记录
select * from table_name;
b限制输出数据记录数量
select * from table_name limit val;
c升序输出数据记录
select * from table_name order by field asc;
d降序输出数据记录
select * from table_name order by field desc;
e条件查询
select * from table_name where expression;
select * from table_name where field in ('val1', 'val2', 'val3');
select * from table_name where field between val1 and val2;
f查询记录数目
select count (*) from table_name;
g区分列数据
select distinct field from table_name;
有一些字段的值可能会重复出现,distinct去掉重复项,将列中各字段值单个列出。
6)建立索引
当说数据表存在大量记录,索引有助于加快查找数据表速度。
create index index_name on table_name(field);
例,针对学生表stu_no字段,建立一个索引:
create index student_index on student_table(stu_no);
建立完成后,sqlite3在对该字段查询时,会自动使用该索引。
7)删除数据表或索引
drop table table_name;
drop index index_name;
SQLite3的运用的更多相关文章
- iOS 数据存储之SQLite3的使用
SQLite3是iOS内嵌的数据库,SQLite3在存储和检索大量数据方面非常有效,它使得不必将每个对象都加到内存中.还能够对数据进行负责的聚合,与使用对象执行这些操作相比,获得结果的速度更快. SQ ...
- Android中如何使用命令行查看内嵌数据库SQLite3
转载博客:http://www.linuxidc.com/Linux/2011-06/37135.htm 在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令. [1]在Andro ...
- flask+sqlite3+echarts2+ajax数据可视化
前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。
安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...
- 安卓虚拟机adb shell sqlite3数据库
adb shell 连接: //http://www.cnblogs.com/xiaobo-Linux/ Android把数据都存放在data/data目录下. 我们使用cd命令转到data/data ...
- SQLite源程序分析之sqlite3.c
/****************************************************************************** ** This file is an a ...
- SQLite3源程序分析之查询处理及优化
前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...
- SQLite3源程序分析之虚拟机
前言 最早的虚拟机可追溯到IBM的VM/370,到上个世纪90年代,在计算机程序设计语言领域又出现一件革命性的事情——Java语言的出现,它与c++最大的不同在于它必须在Java虚拟机上运行.Java ...
- sqlite3的图片的(二进制数据)存取操作
sqlite3的图片的(二进制数据)存取操作 前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...
随机推荐
- 20145201 《Java程序设计》第六周学习总结
20145201 <Java程序设计>第六周学习总结 教材学习内容总结 本周学习了课本第十.十一章内容,即输入/输出.线程与并行API. 第十章 输入输出 10.1 InputStream ...
- 学习笔记1126 - Fib的计算方法,降低了时间复杂度
#include <stdio.h> #include <stdlib.h> #define NUM 10 //如果NUM很大的话,应该申请的动态内存要用long类型吧? in ...
- C++线程池总结
本文采用pthread实现线程池,有以下几个类. CTask:任务抽象类,主要提供接口,供子类实现. CMyTask:继承CTask实现接口 CThreadPool:线程池类,用于管理线程. 信号量: ...
- JQuery -- Validate, Jquery 表单校验
1. Jquery 表单验证需要插件 jQuery validation 1.7 ---验证插件需要:jQuery 1.3.2 或 1.4.2版本 http://jquery.bassistance ...
- canvas画的北斗七星和大熊座
用canvas画的北斗七星和大熊座,主要用到的知识点是:canvas.定时器. html代码: <body> <canvas id="canvas" width= ...
- mysql应该看的blog
一个比较系统的学习mysql的网站:http://www.runoob.com/mysql/mysql-data-types.html
- 解决loadrunner在脚本回放时长时间等待及在vugen中create controller scenario时报错的方法!超管用!!
解决loadrunner在脚本回放时长时间等待及在vugen中create controller scenario时报错的方法 经过咨询,有两种方法.经过实践,下面的方法1有效,方法2无效(我下载安装 ...
- mybatis分页插件使用注意
之前的项目用的数据库是mysql,在pom.xml引入这一个就能分页了. 后来又开了一个项目,使用的是oracle数据库,我写分页的时候发现不能实现,在网上找到资料说是必须要5.0以上的.我就导了这依 ...
- 条款11:记得在operator=中处理自赋值的情况。
本来的版本是这样的: Widget & Widget::operator=(Widget rhs) { delete pb;//这里可能直接将rhs的pb删除了 pb = new (*rhs. ...
- SPS和PPS有哪些重要的参数?
SPS: Level_idc: Bit_depth_luma_minus8: Bit_depth_chroma_minus8: Pic_order_cnt_type: Num_ref_frames: ...