sqlite学习笔记
1.java中的数据类型与sqlite中的对应关系
Boolean 对应 INTEGER(SQLite 并没有单独的布尔存储类型,而是将布尔值存储为整数 0 (false) 和 1 (true)。) Byte 对应 INTEGER Short 对应 INTEGER Integer 对应 INTEGER Long 对应 INTEGER Float 对应 REAL Double 对应 REAL String 对应 TEXT Byte[] 对应 BLOB Date 对应 INTEGER/TEXT/REAL [更详细请参考](http://www.oschina.net/translate/data-types-in-sqlite-version-3?cmp)
2.sqlite 数据库导入导出:.dump 命令$sqlite3 testDB.db .dump > testDB.sql ==>将 testDB.db 数据库的内容到转储到 ASCII 文本文件 testDB.sql 中
$sqlite3 testDB.db < testDB.sql ==>将testDB.sql中的数据恢复(插入)到数据库testDB.db中
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);
4.SQLIte 命令中的 .tables 命令来验证表是否已成功创建 sqlite>.tables COMPANY DEPARTMENT
5.SQLite 删除表sqlite>DROP TABLE COMPANY;--删除表sqlite>.tables;查看删除后的表
6.SQLite Insert 语句创建表:
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);
插入数据
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, ‘Paul‘, 32, ‘California‘, 20000.00 );
也可对应所有字段全部插入:
INSERT INTO COMPANY VALUES (7, ‘James‘, 24, ‘Houston‘, 10000.00 );
也可使用一个表来填充另一个表
INSERT INTO first_table_name [(column1, column2, ... columnN)] SELECT column1, column2, ...columnN FROM second_table_name[WHERE condition];
7.SQLite 逻辑运算符更新 ID 为 6 的客户地址sqlite> UPDATE COMPANY SET ADDRESS = ‘Texas‘ WHERE ID = 6;修改 COMPANY 表中 ADDRESS 和 SALARY 列的所有值sqlite> UPDATE COMPANY SET ADDRESS = ‘Texas‘, SALARY = 20000.00;
9.SQLite Delete 语句删除 ID 为 7 的客户sqlite> DELETE FROM COMPANY WHERE ID = 7;从 COMPANY 表中删除所有记录sqlite> DELETE FROM COMPANY;
10.SQLite Like 子句SQLite 的 LIKE 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用:百分号 (%)下划线 (_)百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。SELECT FROM table_nameWHERE column LIKE ‘XXXX%‘or SELECT FROM table_nameWHERE column LIKE ‘%XXXX%‘orSELECT FROM table_nameWHERE column LIKE ‘XXXX_‘orSELECT FROM table_nameWHERE column LIKE ‘_XXXX‘orSELECT FROM table_nameWHERE column LIKE ‘_XXXX_‘WHERE SALARY LIKE ‘200%‘ 查找以 200 开头的任意值WHERE SALARY LIKE ‘%200%‘ 查找任意位置包含 200 的任意值WHERE SALARY LIKE ‘_00%‘ 查找第二位和第三位为 00 的任意值WHERE SALARY LIKE ‘2_%_%‘ 查找以 2 开头,且长度至少为 3 个字符的任意值WHERE SALARY LIKE ‘%2‘ 查找以 2 结尾的任意值WHERE SALARY LIKE ‘_2%3‘ 查找第二位为 2,且以 3 结尾的任意值WHERE SALARY LIKE ‘2___3‘ 查找长度为 5 位数,且以 2 开头以 3 结尾的任意值注意区分:_下划线和,-减号:显示 COMPANY 表中 ADDRESS 文本里包含一个连字符(-)的所有记录:sqlite> SELECT * FROM COMPANY WHERE ADDRESS LIKE ‘%-%‘;
11.SQLite GLOB 子句SQLite 的 GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。星号 (*)问号 (?)星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用SELECT FROM table_nameWHERE column GLOB ‘XXXX*‘or SELECT FROM table_nameWHERE column GLOB ‘*XXXX*‘orSELECT FROM table_nameWHERE column GLOB ‘XXXX?‘orSELECT FROM table_nameWHERE column GLOB ‘?XXXX‘orSELECT FROM table_nameWHERE column GLOB ‘?XXXX?‘orSELECT FROM table_nameWHERE column GLOB ‘????‘WHERE SALARY GLOB ‘200*‘ 查找以 200 开头的任意值WHERE SALARY GLOB ‘*200*‘ 查找任意位置包含 200 的任意值WHERE SALARY GLOB ‘?00*‘ 查找第二位和第三位为 00 的任意值WHERE SALARY GLOB ‘2??‘ 查找以 2 开头,且长度至少为 3 个字符的任意值WHERE SALARY GLOB ‘*2‘ 查找以 2 结尾的任意值WHERE SALARY GLOB ‘?2*3‘ 查找第二位为 2,且以 3 结尾的任意值WHERE SALARY GLOB ‘2???3‘ 查找长度为 5 位数,且以 2 开头以 3 结尾的任意值
12.SQLite Limit 子句ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.0从表中提取的行数:sqlite> SELECT * FROM COMPANY LIMIT 6;从跳过2行提取3条记录:sqlite> SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
13.SQLite Order By 子句ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.0安装SALARY升序排列:sqlite> SELECT * FROM COMPANY ORDER BY SALARY ASC;结果:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------7 James 24 Houston 10000.02 Allen 25 Texas 15000.01 Paul 32 California 20000.03 Teddy 23 Norway 20000.06 Kim 22 South-Hall 45000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.0=========================================================将结果按 NAME 和 SALARY 升序排序:(顺序从左到右,先按NAME排序,得到结果集在按SALARY排序(不影响第一次排序的基础上排序))如:有Allen1和Allen2,第二次排序只是对此两者的SALARY进行排序sqlite> SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;结果:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------2 Allen 25 Texas 15000.05 David 27 Texas 85000.07 James 24 Houston 10000.06 Kim 22 South-Hall 45000.04 Mark 25 Rich-Mond 65000.01 Paul 32 California 20000.03 Teddy 23 Norway 20000.0按 NAME 降序排序:sqlite> SELECT * FROM COMPANY ORDER BY NAME DESC;ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------3 Teddy 23 Norway 20000.01 Paul 32 California 20000.04 Mark 25 Rich-Mond 65000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.05 David 27 Texas 85000.02 Allen 25 Texas 15000.0
14.SQLite Group By下面给出了 GROUP BY 子句的基本语法。GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前。如:SELECT column-listFROM table_nameWHERE [ conditions ]GROUP BY column1, column2....columnNORDER BY column1, column2....columnN数据表如下: ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.0如果您想了解每个客户的工资总额,则可使用 GROUP BY 查询,如下所示:sqlite> SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;这将产生以下结果:NAME SUM(SALARY)---------- -----------Allen 15000.0David 85000.0James 10000.0Kim 45000.0Mark 65000.0Paul 20000.0Teddy 20000.0我们的表具有重复名称的记录,如下所示:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.08 Paul 24 Houston 20000.09 James 44 Norway 5000.010 James 45 Texas 5000.0让我们用同样的 GROUP BY 语句来对所有记录按 NAME 列进行分组,如下所示:sqlite> SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;这将产生以下结果:NAME SUM(SALARY)---------- -----------Allen 15000David 85000James 20000Kim 45000Mark 65000Paul 40000Teddy 20000
SQLite Having 子句下面是 HAVING 子句在 SELECT 查询中的位置SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT OFFSET 在一个查询中,HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前。下面是包含 HAVING 子句的 SELECT 语句的语法:SELECT column1, column2FROM table1, table2WHERE [ conditions ]GROUP BY column1, column2HAVING [ conditions ]ORDER BY column1, column2COMPANY 表有以下记录:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.08 Paul 24 Houston 20000.09 James 44 Norway 5000.010 James 45 Texas 5000.0下面是一个实例,它将显示名称计数小于 2 的所有记录:sqlite > SELECT * FROM COMPANY GROUP BY name HAVING count(name) < 2;这将产生以下结果:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------2 Allen 25 Texas 150005 David 27 Texas 850006 Kim 22 South-Hall 450004 Mark 25 Rich-Mond 650003 Teddy 23 Norway 20000下面是一个实例,它将显示名称计数大于 2 的所有记录:sqlite > SELECT * FROM COMPANY GROUP BY name HAVING count(name) > 2;这将产生以下结果:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------10 James 45 Texas 5000
SQLite Distinct 关键字SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。语法用于消除重复记录的 DISTINCT 关键字的基本语法如下:SELECT DISTINCT column1, column2,.....columnN FROM table_nameWHERE [condition]实例假设 COMPANY 表有以下记录:ID NAME AGE ADDRESS SALARY---------- ---------- ---------- ---------- ----------1 Paul 32 California 20000.02 Allen 25 Texas 15000.03 Teddy 23 Norway 20000.04 Mark 25 Rich-Mond 65000.05 David 27 Texas 85000.06 Kim 22 South-Hall 45000.07 James 24 Houston 10000.08 Paul 24 Houston 20000.09 James 44 Norway 5000.010 James 45 Texas 5000.0首先,让我们来看看下面的 SELECT 查询,它将返回重复的工资记录:sqlite> SELECT name FROM COMPANY;这将产生以下结果:NAME----------PaulAllenTeddyMarkDavidKimJamesPaulJamesJames现在,让我们在上述的 SELECT 查询中使用 DISTINCT 关键字:sqlite> SELECT DISTINCT name FROM COMPANY;这将产生以下结果,没有任何重复的条目:NAME----------PaulAllenTeddyMarkDavidKimJames
参考自:http://www.runoob.com/sqlite/sqlite-operators.html
sqlite学习笔记
标签:
小编还为您整理了以下内容,可能对您也有帮助:
如何使用sqlite创建数据库
首先还是说一下cmd下sqlite的使用网上已经很多了、不做过多的赘述。大致说一下相应的命令就行了、作为学习sqlite的一个记录
1:选择下载对应自己系统的sqlite.3exe文件
2:解压后使用cmd命令进入sqlite3.exe文件所在的路径执行命令就可以操作做相应的操作。
在进入数据库之后如果需要退出的话windows下摁ctrl+c就能退出
例如:
创建数据库命令:sqlite3.exe 【数据库名字.后缀名】
这里比较牛一点的感觉就是创建的数据库后缀名是任意的、不过注意一点就是:在命令框下执行创建数据库的时候。
如果没有为数据库创建表格、则看不见数据库文件,所以必须创建表格。
例如:在CMD命令提示符下输入sqlite3.exe test.db(test.db是数据库名)回车,执行完后,命令提示符自动跳转
到"SQLITE>"状态。这时还是看不到这个数据库!等表格创建或关闭sqlite3
例如:create table user(’用户名‘); 这时可以看到sqlite3.exe所在文件夹下的这个数据库文件了
如果下次还要使用此数据库时仍然使用sqlite3.exe test.db即可进入此数据库
创建表格命令:create table tablename(字段,字段)
这里从命令上可以清楚的看到、在sqlite数据库中创建表格字段的时候、允许不为字段申明数据类型。
这是区别于其它关系型数据库的。
执行插入命令:insert into tablename values(value,values)在、前面我们可以看出、sqlite的操作上和
sqlserver没什么太大区别、值得注意的是、insert时区别于sqlserver中、因为sqlserver中允许使用
"insert table name values(value,value)"这样的省略式擦入。但是sqlite中是不允许使用省略式插入语句的。
执行删除语句:delete from tablename where <条件>
删除数据语法和sqlserver相同、
删除表则命令为:drop table tablename
数据更新命令:update tablename set 字段=值 如果需要条件的话、添加上where语句。
执行查询语句:select *from tablename 可跟随where语句
以上就是基础的sqlite的增删查改语法和命令。
python sqlite3 怎么处理
要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;
连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。
# 导入SQLite驱动:
>>> import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db
# 如果文件不存在,会自动在当前目录创建:
>>> conn = sqlite3.connect('test.db')
# 创建一个Cursor:
>>> cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x10f8aa260>
# 继续执行一条SQL语句,插入一条记录:
>>> cursor.execute('insert into user (id, name) values ('1', 'Michael')')
<sqlite3.Cursor object at 0x10f8aa260>
# 通过rowcount获得插入的行数:
>>> cursor.rowcount
1
# 关闭Cursor:
>>> cursor.close()
# 提交事务:
>>> conn.commit()
# 关闭Connection:
>>> conn.close()
推荐学习资料:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001388320596292f925f46d56ef4c80a1c9d8e47e2d5711000
python sqlite3 怎么处理
要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection;
连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果。
Python定义了一套操作数据库的API接口,任何数据库要连接到Python,只需要提供符合Python标准的数据库驱动即可。
# 导入SQLite驱动:
>>> import sqlite3
# 连接到SQLite数据库
# 数据库文件是test.db
# 如果文件不存在,会自动在当前目录创建:
>>> conn = sqlite3.connect('test.db')
# 创建一个Cursor:
>>> cursor = conn.cursor()
# 执行一条SQL语句,创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x10f8aa260>
# 继续执行一条SQL语句,插入一条记录:
>>> cursor.execute('insert into user (id, name) values ('1', 'Michael')')
<sqlite3.Cursor object at 0x10f8aa260>
# 通过rowcount获得插入的行数:
>>> cursor.rowcount
1
# 关闭Cursor:
>>> cursor.close()
# 提交事务:
>>> conn.commit()
# 关闭Connection:
>>> conn.close()
推荐学习资料:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001388320596292f925f46d56ef4c80a1c9d8e47e2d5711000
sqlite如何提前createtable
解决办法:创建SQLite数据库中表的语法和其它数据库创建表基本一致,其sql语法如下:
CREATE TABLE table_name(
column_name1 datatype1 [extra_info1],
column_name2 datatype2 [extra_info2],
column_name3 datatype3 [extra_info3],
.....
column_namen datatype4 [extra_info4]
);
使用CREATE TABLE来指定创建表,其table_name是我们需要创建的表的名称,一般使用字母,数据和下划线。
数据库表中的名称应在数据库中唯一,不得和其它表名重复,但不同的数据库中可以有相同的表名。
一般表名习惯是以t_开头,后接表的名称,多个单字用下划线分隔。如t_web,t_user_info。
表中的列一般包括3个信息,分别为列名,列类型和附加信息。
列名,表示该列存储的信息名称,惟一。
列类型,用于指定数据类型。具体可查看SQLite 数据类型信息。
附加信息一般可选,一般用于描述是否为主键,默认信息或其它修饰信息。
实例
下面我们来创建一个名为t_student的表,其含有三个信息分别为:
Id:编号,整数型,主键。
name:姓名,字符串,不为空。
score:成绩,实数型,不为空。
这样我们创建表的sql语句为:
create table t_student(
id int primary key not null,
name text not null,
score real
);
注意:sql语句不区分大小写。
运行如下:
sqlite> create table t_student(
...> id int primary key not null,
...> name text not null,
...> score real
...> );
sqlite> .schema t_student
CREATE TABLE t_student(
id int primary key not null,
name text not null,
score real
);
SQLite快速创建表
由于SQLite的数据类型是弱类型的,即存储的数据可以是数据类型具有五种任意类型。所以在创建表时也可以不指定表的数据类型,即数据类型是可选的。
如我们创建一个含有a,b,c,d,e,f五列的表,但并未指定数据类型,所以这5列是可以存储任意的数据类型。
sqlite> create table t_test4(a,b,c,d,e);
sqlite> .schema t_test4
CREATE TABLE t_test4(a,b,c,d,e);
随手分享,手有余香
字节流是站长多年来的工作经验和技术总结,和站长一起学习,每天都有进步。
通俗易懂,深入浅出。
文章不深奥,不需要钻研,不烧脑细胞,人人都可以学习,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
分类汇总后提取的数据可以进行匹配吗
在 Excel
中,按年、月、日和周分类汇总用数据透视表比较简单方便,进行简单的设置就可以返回它们的汇总结果;按年、月和日汇总可以直接显示它们,但按周汇总只能用日期表示周;而用公式汇总可以实现把属于每周的日期转为第几周。用公式实现按年、月和周分类汇总,主要用
Sum、SumIfs、SumProct、Value、WeekNum、Date、Row 和 Text
等函数,例如按年和月汇总用前四个函数...
在Excel表使用中,经常需求进行复制等操作,将一个表的内容复制到领一个表中。如果要复制分类汇总中的汇总结果,直接复制的话会出现错误,在此介绍一下如何将分类汇总中的结果复制到其他位置。此方法可以只复制想要的结果。首先要将分类汇总后的结果只显示合计值,在Excel表的最左侧点击“-”符号,变成“+”符号。选中要复制的汇总结果。
一、loc、iloc筛选器进行数据提取loc按照数据表的索引标签进行提取数据表的标签分行标签和列标签,这里讨论的是二维数据表。除列标签筛选之外还可以使用boolean
array进行筛选提取id为1004的学生分数提取id在1004之前的学生姓名和分数根据bool类型的数组进行提取iloc按位置进行提取按位置区域提取按位置逐条提取数据根据bool类型的数组进行提取备注:从0.20.0开始,.ix索...
Excel分类汇总后,我是这样提取汇总项目的!
想必大家都用过Excel分类汇总这个功能吧,反正小编在学会数据透视表之前都是用这个功能的。
那么现在有一个问题:就是在做完分类汇总后,如何将汇总项复制粘贴提取出来呢?如下图:选中数据,点击分类汇总,分类字段为部门,汇总方式为求和,选定汇总项设置为销售额,其他默认,点击确定。这时候,我们就完成了分类汇总(按部门汇总销售额),我们欲将汇总项复制出来,按照普通的复制粘贴会出现下图错误:动图演示过程:
解决方法:选中汇总区域,用CTRL+G,快速调出定位窗口,定位可见单元格,再复制粘贴,我们发现成功的提取
【Excel技巧】分类汇总数据单独复制的简便方法
很多时候需要将分类汇总后的数据单独拿出来做处理,记得还很早的时候有网友在QQ上问过我关于分类汇总要怎么样才能单独复制出来,当时在网上搜索了一下,没找到解决办法,就自己试着做了一遍,发现是可以复制出来单独粘贴的,让他照着我做,他在那头回答不行,咦~为什么他不行,而我就可以?问题出在哪里,难道是版本问题?于是问他,他用的是2003版,跟我一样,奇怪了,经在QQ跟他来回...
Excel中复制分类汇总后的结果
在2级汇总视图下,复制并粘贴后的结果中扔带有明细数据,那么如何才能只复制汇总后的数据呢?具体操作步骤如下:
选中汇总后的2级视图中的整个数据区域。
按【Alt+;】组合键,将只选中当前显示出来的单元格,而不包含隐藏的明细数据。 按【Ctrl+C】组合键复制。
然后在目标区域中按【Ctrl+V】组合键粘贴,即可只粘贴汇总数据。
...
实现数据分类汇总的SQL语句
excel
如何提取分类汇总后的数据
对EXCEL中分类汇总的数据进行复制碰到无法复制的问题
SQLite是Android平台软件开发中会经常用到的数据库产品,作为一款轻型数据库,SQLite的设计目标就是是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够。
废话不多说,让我们来写一个sqlite的demo。 首先建立一个项目 目录如下:
SQLite学习笔记(三)--创建内存数据库
主要代码 sqlite3 *m_db; int
nRet=sqlite3_open(":memory:", &m_db);创建内存数据库 if (nRet==0) {
......数据库操作,就和其他数据库没啥分别。}
sqlite3_close(m_db);关闭数据库,进行这步操作时会释放内存数据库。大体测试了一下,14万的数据进行查询,分类汇总大约只需要2秒钟左右吧!!...
sqlite获取以周、月、年为单位数据的语句
分类汇总后提取的数据可以进行匹配吗
在 Excel
中,按年、月、日和周分类汇总用数据透视表比较简单方便,进行简单的设置就可以返回它们的汇总结果;按年、月和日汇总可以直接显示它们,但按周汇总只能用日期表示周;而用公式汇总可以实现把属于每周的日期转为第几周。用公式实现按年、月和周分类汇总,主要用
Sum、SumIfs、SumProct、Value、WeekNum、Date、Row 和 Text
等函数,例如按年和月汇总用前四个函数...
在Excel表使用中,经常需求进行复制等操作,将一个表的内容复制到领一个表中。如果要复制分类汇总中的汇总结果,直接复制的话会出现错误,在此介绍一下如何将分类汇总中的结果复制到其他位置。此方法可以只复制想要的结果。首先要将分类汇总后的结果只显示合计值,在Excel表的最左侧点击“-”符号,变成“+”符号。选中要复制的汇总结果。
一、loc、iloc筛选器进行数据提取loc按照数据表的索引标签进行提取数据表的标签分行标签和列标签,这里讨论的是二维数据表。除列标签筛选之外还可以使用boolean
array进行筛选提取id为1004的学生分数提取id在1004之前的学生姓名和分数根据bool类型的数组进行提取iloc按位置进行提取按位置区域提取按位置逐条提取数据根据bool类型的数组进行提取备注:从0.20.0开始,.ix索...
Excel分类汇总后,我是这样提取汇总项目的!
想必大家都用过Excel分类汇总这个功能吧,反正小编在学会数据透视表之前都是用这个功能的。
那么现在有一个问题:就是在做完分类汇总后,如何将汇总项复制粘贴提取出来呢?如下图:选中数据,点击分类汇总,分类字段为部门,汇总方式为求和,选定汇总项设置为销售额,其他默认,点击确定。这时候,我们就完成了分类汇总(按部门汇总销售额),我们欲将汇总项复制出来,按照普通的复制粘贴会出现下图错误:动图演示过程:
解决方法:选中汇总区域,用CTRL+G,快速调出定位窗口,定位可见单元格,再复制粘贴,我们发现成功的提取
【Excel技巧】分类汇总数据单独复制的简便方法
很多时候需要将分类汇总后的数据单独拿出来做处理,记得还很早的时候有网友在QQ上问过我关于分类汇总要怎么样才能单独复制出来,当时在网上搜索了一下,没找到解决办法,就自己试着做了一遍,发现是可以复制出来单独粘贴的,让他照着我做,他在那头回答不行,咦~为什么他不行,而我就可以?问题出在哪里,难道是版本问题?于是问他,他用的是2003版,跟我一样,奇怪了,经在QQ跟他来回...
Excel中复制分类汇总后的结果
在2级汇总视图下,复制并粘贴后的结果中扔带有明细数据,那么如何才能只复制汇总后的数据呢?具体操作步骤如下:
选中汇总后的2级视图中的整个数据区域。
按【Alt+;】组合键,将只选中当前显示出来的单元格,而不包含隐藏的明细数据。 按【Ctrl+C】组合键复制。
然后在目标区域中按【Ctrl+V】组合键粘贴,即可只粘贴汇总数据。
...
实现数据分类汇总的SQL语句
excel
如何提取分类汇总后的数据
对EXCEL中分类汇总的数据进行复制碰到无法复制的问题
SQLite是Android平台软件开发中会经常用到的数据库产品,作为一款轻型数据库,SQLite的设计目标就是是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够。
废话不多说,让我们来写一个sqlite的demo。 首先建立一个项目 目录如下:
SQLite学习笔记(三)--创建内存数据库
主要代码 sqlite3 *m_db; int
nRet=sqlite3_open(":memory:", &m_db);创建内存数据库 if (nRet==0) {
......数据库操作,就和其他数据库没啥分别。}
sqlite3_close(m_db);关闭数据库,进行这步操作时会释放内存数据库。大体测试了一下,14万的数据进行查询,分类汇总大约只需要2秒钟左右吧!!...
sqlite获取以周、月、年为单位数据的语句
如何使用cancellationsignal
使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为:
(1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。
(2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。具体使用方法可以参阅博文《Android学习笔记35:使用Shared Preferences方式存储数据》。
(3)Content Providers:数据共享,用于应用程序之间数据的访问。
(4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。
(5)Network:通过网络来存储和获取数据。
本篇博文介绍第四种方式,通过Android自带的SQLite数据库存储数据。
1.SQLite简介
SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。
SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。
数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的操作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但是只有一个可以写入数据。在某个进程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读写操作将不会再发生。
此外,SQLite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。SQLite数据库还支持大部分操作系统,除电脑上使用的操作系统之外,很多手机上使用的操作系统同样可以运行。同时,SQLite数据库还提供了多语言的编程接口,供开发者使用。
如何使用cancellationsignal
使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为:
(1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。
(2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。具体使用方法可以参阅博文《Android学习笔记35:使用Shared Preferences方式存储数据》。
(3)Content Providers:数据共享,用于应用程序之间数据的访问。
(4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。
(5)Network:通过网络来存储和获取数据。
本篇博文介绍第四种方式,通过Android自带的SQLite数据库存储数据。
1.SQLite简介
SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。
SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。
数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的操作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但是只有一个可以写入数据。在某个进程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读写操作将不会再发生。
此外,SQLite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。SQLite数据库还支持大部分操作系统,除电脑上使用的操作系统之外,很多手机上使用的操作系统同样可以运行。同时,SQLite数据库还提供了多语言的编程接口,供开发者使用。
android sqlite数据库的更新
一、使用嵌入式关系型SQLite数据库存储数据
在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
复制代码 代码如下:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智',3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
二、使用SQLiteOpenHelper对数据库进行版本管理
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase()和 getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但 getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
代码:
复制代码 代码如下:
public class DatabaseHelper extends SQLiteOpenHelper {
//类没有实例化,是不能用作父类构造器的参数,必须声明为静态
private static final String name = "ljqdb"; //数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context) {
//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (
personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
// DROP TABLE IF EXISTS person 删除表
}
}
在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失。
三、使用SQLiteDatabase操作SQLite数据库
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
execSQL()方法的使用例子:
复制代码 代码如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('林计钦', 24)");
db.close();
执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“林计钦”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
复制代码 代码如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
db.close();
execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:
复制代码 代码如下:
SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:
复制代码 代码如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林计钦%", "4"});
Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。
除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。
android sqlite数据库的更新
一、使用嵌入式关系型SQLite数据库存储数据
在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
复制代码 代码如下:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智',3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
二、使用SQLiteOpenHelper对数据库进行版本管理
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getWritableDatabase()和 getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但 getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
代码:
复制代码 代码如下:
public class DatabaseHelper extends SQLiteOpenHelper {
//类没有实例化,是不能用作父类构造器的参数,必须声明为静态
private static final String name = "ljqdb"; //数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context) {
//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (
personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
// DROP TABLE IF EXISTS person 删除表
}
}
在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失。
三、使用SQLiteDatabase操作SQLite数据库
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
execSQL()方法的使用例子:
复制代码 代码如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('林计钦', 24)");
db.close();
执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“林计钦”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
复制代码 代码如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
db.close();
execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:
复制代码 代码如下:
SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
String name = cursor.getString(1);//获取第二列的值
int age = cursor.getInt(2);//获取第三列的值
}
cursor.close();
db.close();
rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:
复制代码 代码如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林计钦%", "4"});
Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。
除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。
sqlite如何查询第一条记录
Android 连接数据库
Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式操作上有很广泛的,WM采用的也是SQLite3
关于过于、原理方面的东西在这篇文章里不会提到,但是如果你想能够快速的学会操作SQLite3,那这就是你要找的文章!
首先,我们看一下api,所有数据库相关的接口、类都在.database和android.database.sqlite两个包下,虽然只有两个包,但是如果你英文不好或是太懒的话也要迷茫一段时间,其实,我们真正用的到的没有几个!
1、SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)
这是一个抽象类,关于抽象类我们都知道,如果要使用它,一定是继承它!
这个类的方法很少,有一个构造方法
SQLiteOpenHelper(android.content.Context context, java.lang.String name,android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version);
参数不做过多的解释,CursorFactory一般直接传null就可以
public void onCreate(SQLiteDatabase db)
此方法在创建数据库是被调用,所以,应该把创建表的操作放到这个方法里面,一会儿在后面我们会再详细的说如何创建表
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
从方法名上我们就能知道这个方法是执行更新的,没错,当version改变是系统会调用这个方法,所以在这个方法里应该执行删除现有表,然后手动调用onCreate的操作
SQLiteDatabase getReadableDatabase()
可读的SQLiteDatabase对象
SQLiteDatabase getWritableDatabase()
获取可写的SQLiteDatabase对象
2、SQLiteDatabase(android.database.sqlite.SQLiteDatabase)
关于操作数据库的工作(增、删、查、改)都在这个类里
execSQL(sql)
执行SQL语句,用这个方法+SQL语句可以非常方便的执行增、删、查、改
除此之外,Android还提供了功过方法实现增、删、查、改
long insert(TABLE_NAME, null, contentValues)添加记录
int delete(TABLE_NAME, where, whereValue)删除记录
int update(TABLE_NAME, contentValues, where, whereValue) 更新记录
Cursor query(TABLE_NAME, null, null, null, null, null, null) 查询记录
除此之外,还有很多方法,如:beginTransaction()开始事务、endTransaction()结束事务...有兴趣的可以自己看api,这里就不多赘述了
3、Cursor(android.database.Cursor)
游标(接口),这个很熟悉了吧,Cursor里的方法非常多,常用的有:
boolean moveToPosition(position)将指针移动到某记录
getColumnIndex(Contacts.People.NAME)按列名获取id
int getCount()获取记录总数
boolean requery()重新查询
boolean isAfterLast()指针是否在末尾
boolean isBeforeFirst()时候是开始位置
boolean isFirst()是否是第一条记录
boolean isLast()是否是最后一条记录
boolean moveToFirst()、 boolean moveToLast()、 boolean moveToNext()同moveToPosition(position)
4、SimpleCursorAdapter(android.widget.SimpleCursorAdapter)
也许你会奇怪了,之前我还说过关于数据库的操作都在database和database.sqlite包下,为什么把一个Adapter放到这里,如果你用过Android的SQLite3,你一定会知道
,这是因为我们对数据库的操作会经常跟列表联系起来
经常有朋友会在这出错,但其实也很简单
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
this,
R.layout.list,
myCursor,
new String[] ,
new int[]);
my.setAdapter(adapter);
一共5个参数,具体如下:
参数1:Content
参数2:布局
参数3:Cursor游标对象
参数4:显示的字段,传入String[]
参数5:显示字段使用的组件,传入int[],该数组中是TextView组件的id
到这里,关于数据库的操作就结束了,但是到目前为止我只做了翻译的工作,有些同学可能还是没有掌握,放心,下面我们一起顺着正常开发的思路理清一下头绪!
前面的只是帮没做过的朋友做下普及,下面才是你真正需要的!
一、写一个类继承SQLiteOpenHelpe
public class DatabaseHelper extends SQLiteOpenHelper
构造方法:
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在onCreate方法里写建表的操作
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE tb_test (_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,class_jb TEXT NOT NULL,class_ysbj TEXT NOT NULL,title TEXT NOT NULL,content_ysbj TEXT NOT NULL)";
db.execSQL(sql);//需要异常捕获
}
在onUpgrade方法里删除现有表,然后手动调用onCtreate创建表
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "drop table "+tbname;
db.execSQL(sql);
onCreate(db);
}
对表增、删、查、改的方法,这里用的是SQLiteOpenHelper提供的方法,也可以用sql语句实现,都是一样的
关于获取可读/可写SQLiteDatabase,我不说大家也应该会想到,只有查找才会用到可读的SQLiteDatabase
/**
* 添加数据
*/
public long insert(String tname, int tage, String ttel){
SQLiteDatabase db= getWritableDatabase();//获取可写SQLiteDatabase对象
//ContentValues类似map,存入的是键值对
ContentValues contentValues = new ContentValues();
contentValues.put("tname", tname);
contentValues.put("tage", tage);
contentValues.put("ttel", ttel);
return db.insert(tbname, null, contentValues);
}
/**
* 删除记录
* @param _id
*/
public void delete(String _id){
SQLiteDatabase db= getWritableDatabase();
db.delete(tbname,
"_id=?",
new String[]);
}
/**
* 更新记录的,跟插入的很像
*/
public void update(String _id,String tname, int tage, String ttel){
SQLiteDatabase db= getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("tname", tname);
contentValues.put("tage", tage);
contentValues.put("ttel", ttel);
db.update(tbname, contentValues,
"_id=?",
new String[]);
}
/**
* 查询所有数据
* @return Cursor
*/
public Cursor select(){
SQLiteDatabase db = getReadableDatabase();
return db.query(
tbname,
new String[],
null,
null, null, null, "_id desc");
}
关于db.query方法的参数,有很多,为了防止大家弄乱,我简单说一下
参数1:表名
参数2:返回数据包含的列信息,String数组里放的都是列名
参数3:相当于sql里的where,sql里where后写的内容放到这就行了,例如:tage>?
参数4:如果你在参数3里写了?(知道我为什么写tage>?了吧),那个这里就是代替?的值 接上例:new String[]
参数5:分组,不解释了,不想分组就传null
参数6:having,想不起来的看看SQL
参数7:orderBy排序
到这里,你已经完成了最多的第一步!我们来看看都用到了那些类:
SQLiteOpenHelper我们继承使用的
SQLiteDatabase增删查改都离不开它,即使你直接用sql语句,也要用到execSQL(sql)
二、这里无非是对DatabaseHelper类定义方法的调用,没什么可说的,不过我还是对查询再唠叨几句吧
Android查询出来的结果一Cursor形式返回
cursor = sqLiteHelper.select();//是不是很简单?
查询出来的cursor一般会显示在listView中,这就要用到刚才提到的SimpleCursorAdapter
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
this,
R.layout.list_row,
cursor,
new String[],
new int[]
);
Node.js如何对SQLite的async/await封装详解
前言
本文主要给大家介绍的是关于Node.js对SQLite的async/await封装的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
用于将每个SQLite函数同步化,并可以用await的接口。
注意:需要SQLite for Node模块和Node.js 8.0+,并支持async / await。
SQLite最常用作本地或移动应用程序的存储单元,当需要从程序的各个部分访问数据时,回调不是最佳解决方案。
为了在程序程序中更自然地访问数据,我编写了一个将回调转换为promises的接口,因此我们可以将每个函数与await关键字一起使用。 它不是异步函数的替代品,它是一个补充,可以将原始函数和同步函数一起使用。
aa-sqlite模块
SQLite的接口是一个名为aa-sqlite的模块,您必须将其存储在应用程序的node_moles部分中。这是完整的源代码
const sqlite3 = require('sqlite3').verbose()
var db
exports.db = db
exports.open=function(path) {
return new Promise(function(resolve) {
this.db = new sqlite3.Database(path,
function(err) {
if(err) reject("Open error: "+ err.message)
else resolve(path + " opened")
}
)
})
}
// any query: insert/delete/update
exports.run=function(query) {
return new Promise(function(resolve, reject) {
this.db.run(query,
function(err) {
if(err) reject(err.message)
else resolve(true)
})
})
}
// first row read
exports.get=function(query, params) {
return new Promise(function(resolve, reject) {
this.db.get(query, params, function(err, row) {
if(err) reject("Read error: " + err.message)
else {
resolve(row)
}
})
})
}
// set of rows read
exports.all=function(query, params) {
return new Promise(function(resolve, reject) {
if(params == undefined) params=[]
this.db.all(query, params, function(err, rows) {
if(err) reject("Read error: " + err.message)
else {
resolve(rows)
}
})
})
}
// each row returned one by one
exports.each=function(query, params, action) {
return new Promise(function(resolve, reject) {
var db = this.db
db.serialize(function() {
db.each(query, params, function(err, row) {
if(err) reject("Read error: " + err.message)
else {
if(row) {
action(row)
}
}
})
db.get("", function(err, row) {
resolve(true)
})
})
})
}
exports.close=function() {
return new Promise(function(resolve, reject) {
this.db.close()
resolve(true)
})
}
使用示例
下面的示例展示了aa-sqlite的每个功能的示例。在第一部分中,我们打开一个数据库,添加一个表并用一些行填充该表。然后关闭数据库,我们再次打开它并执行一些同步查询。
const fs = require("fs")
const sqlite = require("aa-sqlite")
async function mainApp() {
console.log(await sqlite.open('./users.db'))
// Adds a table
var r = await sqlite.run('CREATE TABLE users(ID integer NOT NULL PRIMARY KEY, name text, city text)')
if(r) console.log("Table created")
// Fills the table
let users = {
"Naomi": "chicago",
"Julia": "Frisco",
"Amy": "New York",
"Scarlett": "Austin",
"Amy": "Seattle"
}
var id = 1
for(var x in users) {
var entry = `'${id}','${x}','${users[x]}'`
var sql = "INSERT INTO users(ID, name, city) VALUES (" + entry + ")"
r = await sqlite.run(sql)
if(r) console.log("Inserted.")
id++
}
// Starting a new cycle to access the data
await sqlite.close();
await sqlite.open('./users.db')
console.log("Select one user:")
var sql = "SELECT ID, name, city FROM users WHERE name='Naomi'"
r = await sqlite.get(sql)
console.log("Read:", r.ID, r.name, r.city)
console.log("Get all users:")
sql = "SELECT * FROM users"
r = await sqlite.all(sql, [])
r.forEach(function(row) {
console.log("Read:", row.ID, row.name, row.city)
})
console.log("Get some users:")
sql = "SELECT * FROM users WHERE name=?"
r = await sqlite.all(sql, ['Amy'])
r.forEach(function(row) {
console.log("Read:", row.ID, row.name, row.city)
})
console.log("One by one:")
sql = "SELECT * FROM users"
r = await sqlite.each(sql, [], function(row) {
console.log("Read:", row.ID, row.name, row.city)
})
if(r) console.log("Done.")
sqlite.close();
}
try {
fs.unlinkSync("./users.db")
}
catch(e) {
}
mainApp()
由于all方法返回一个row数组,我们使用forEach来处理每一行的内容。
你可以在每个方法的情况下进行验证,即在程序显示“完成”之前处理返回的每一行。原始异步方法不会出现这种情况。
参考并翻译自:https://www.scriptol.com/sql/sqlite-async-await.php
总结