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的运用的更多相关文章

  1. iOS 数据存储之SQLite3的使用

    SQLite3是iOS内嵌的数据库,SQLite3在存储和检索大量数据方面非常有效,它使得不必将每个对象都加到内存中.还能够对数据进行负责的聚合,与使用对象执行这些操作相比,获得结果的速度更快. SQ ...

  2. Android中如何使用命令行查看内嵌数据库SQLite3

    转载博客:http://www.linuxidc.com/Linux/2011-06/37135.htm 在上图中,除了最后一个红色的方框,其它方框都是adb shell下的命令. [1]在Andro ...

  3. flask+sqlite3+echarts2+ajax数据可视化

    前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...

  4. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  5. 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。

    安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...

  6. 安卓虚拟机adb shell sqlite3数据库

    adb shell 连接: //http://www.cnblogs.com/xiaobo-Linux/ Android把数据都存放在data/data目录下. 我们使用cd命令转到data/data ...

  7. SQLite源程序分析之sqlite3.c

    /****************************************************************************** ** This file is an a ...

  8. SQLite3源程序分析之查询处理及优化

    前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...

  9. SQLite3源程序分析之虚拟机

    前言 最早的虚拟机可追溯到IBM的VM/370,到上个世纪90年代,在计算机程序设计语言领域又出现一件革命性的事情——Java语言的出现,它与c++最大的不同在于它必须在Java虚拟机上运行.Java ...

  10. sqlite3的图片的(二进制数据)存取操作

    sqlite3的图片的(二进制数据)存取操作   前言 上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电 ...

随机推荐

  1. django使用migrations迁移版本和数据库中报错解决方案

    1.到数据库表django_migrations中查看app中看看app列 2.到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样 3.找到哪里不一致的文 ...

  2. 配置可对外链接的Redis

    链接服务器的Redis telnet 192.168.1.200 6379 Trying 192.168.1.200... telnet: Unable to connect to remote ho ...

  3. 报错Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus

    报错Mapped Statements collection does not contain value for com.atguigu.mybatis.dao.EmployeeMapperPlus ...

  4. 图片qq浏览器不显示,微信显示问题原因

    1.qq浏览器关闭云加速就可以了

  5. mysql 导入表数据中文乱码

    方法一: 先在命令行设置为utf8,再导入 1. use database_name; 2. set names utf8; (或其他需要的编码) 3. source example.sql (sql ...

  6. Python Falling back to the 'python' engine because the 'c' engine does not support regex separators

    环境 Anaconda3 Python 3.6, Window 64bit 书籍 O'Reilly出版的Wes McKinney编的<Python for Data Analysis> 警 ...

  7. yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节

    yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节 请用mb_substr转成1个英文字节

  8. 新版appium绘制九宫格的一个注意点

    在用appium-desktop-setup-1.6.2进行app手势密码设置时,发现move_to(x, y)相对偏移量的方法用不了,绘制的手势也是乱跑 还会抛一个错误 selenium.commo ...

  9. Windows Server 2016 桌面环境的自动配置脚本(2017-10-24更新)

    github:https://github.com/m2nlight/WindowsServerToWindowsDesktop 下载:https://github.com/m2nlight/Wind ...

  10. 【spark】常用转换操作:sortByKey()和sortBy()

    1.sortByKey() 功能: 返回一个根据键排序的RDD 示例 val list = List(("a",3),("b",2),("c" ...