一、SQL基础
一个数据库通常包含一个或多个表,每个表由一个名字标识,表包含带有数据的记录(行)。
一下是一个名为“Persons”的表(包含两条记录和五个列):
Id | LastName | FirstName | Address | City |
1 | Adams | John | address1 |
city1 |
2 | Bush | George | address2 | city2 |
在数据库上的大部分错做都由Sql语句完成。
select LastName from Persons
结果集:
LastName |
Adams |
Bush |
注:SQL语句对大小写不敏感。
可以把SQL分为两个部分:数据库操作语言(DML)和数据库定义语言(DDL)
查询和更新指令构成了SQL的DML部分:
select -从数据库获取数据
update -更新数据库表中的数据
delete -从数据库删除数据
insert into -向数据库表中插入数据
SQL中最重要的DDL语句:
create database -创建数据库
alert database -修改数据库
create table -创建新表
alert table -变更(改变)数据库表
drop table -删除表
create index -创建索引(搜索键)
drop index -删除索引
select语句
select语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。
select 列名称 from 表名称 或 select 列名称1,列名称2,.. from 表名称
以及
select * from 表名称(这个是获取表名为表名称的所有列的数据,*为获取所有列的快捷方式)
select disdinct语句用于返回唯一不同的值
select distinct 列名称 from 表名称
SQL where子句(如有条件的从表中选取数据,可将where子句添加到select语句)
select 列名称 from 表名称 where 列 运算符 值
下面的运算符可在where子句中使用:
操作符 | 描述 |
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
between | 在某个范围内 |
like | 搜索某种模式 |
例如:获取居住在城市“city1”中的人:
select * from Persons where City=‘city1’
注意:SQL用单引号来环绕文本值(大部分数据库系统也接受双引号),如果是数值,请不要用引号。
//正确 select * from Persons where FirstName = 'bush' //错误 select * from Persons where Year>'1965'
SQL and & or 运算符(可以在where子语句中把两个或多个条件结合起来)
如果第一个条件和第二个条件都成立,则and显示一条记录
如果第一个条件和第二个条件中只要有一个成立,则or运算符显示一条记录
SELECT * from Persons WHERE firstname='John' OR lastname='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
SQL order by子句(用于根据指定的列结果集进行排序)
默认按照升序对记录进行排序(ASC),降序(DESC)
//以字母顺序显示公司名称
SELECT Company, OrderNumber FROM Orders ORDER BY Company
//以字母顺序显示公司名称,兵役数字顺序显示顺序号
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
//以逆字母顺序显示公司名称
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
//以逆字母顺序显示公司名,并以数字顺序显示顺序号
select Company,OrderNumber from 表名 orders by Company desc,OderNumber ASC
SQL insert into语句
用于向表格中插入新的行
insert into 表名称 values (值1,值2,...)
也可以指定索要插入数据的列:
insert into 表名称(列1,列2,...) values (值1,值2,...)
SQL update 语句
用于修改表中的数据。
update 表名称 set 列名称 = 新值 where 列名称 = 某值
SQL delete语句
用于删除表中的行
delete from 表名称 where 列名称 = 值
SQL 通配符:
通配符 | 描述 |
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
//从 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人 SELECT * FROM Persons WHERE City LIKE 'Ne%' //从 "Persons" 表中选取居住在包含 "lond" 的城市里的人 select * from Persons where City like '%lond%' //从 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人 select * from Persons where FirstName like '_eorge' //从 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人 select * from Persons where City like '[ALN]%'
二、使用SQLiteOpenHelper对数据库进行版本管理
SQLiteOpenHelper类的构造方法:
所有继承了这个类的类都必须实现下面这样一个构造方法:
public DatabaseHelper(Context context,String name,CursorFactory factory,int version)
//第一个参数:Context类型,上下文对象
//第二个参数:String类型,数据库的名称
//第三个参数:CursorFactory类型
//第四个参数:int类型,数据库版本
//注意:数据库名称只需要写数据库名就可以,会自动把数据库存入到app的目录下
// CursorFactory一般使用null即可
SQLiteOpenHelper类提供了两个方法:
onCreate(SQLiteDataBase db ):用于初次使用软件时生成数据库列表,一般在这个方法中创建数据的相应表
onUpgrade(SQLiteDatabsse db, int oldVersion ,int newVersion):用于升级软件时更新数据库表结构
当调用getReadableDatabase或者getWriteableDatabase方法时才真正创建数据库,返回一个数据库对象,数据库存储到了data/data/包名/databases。
getReadableDatabase()创建或者打开一个可读写的数据库,如果出现问题(磁盘满等),则打开一个只读的数据库,而getWriteableDatabase()获得一个可读写的数据库,如果磁盘满会抛出异常。
三、使用SQLiteDataBase操作SQLite数据库
应重点掌握execSQL()和rawQuery()方法。
execSql()方法可以执行insert、delete、update和create table之类有更改行为的SQL语句,没有返回值,rawQuery()方法用于执行查询语句。
示例:
SQLiteDataBase db = this.getReadableDatabase();
//一般不用这个
//db.execSQL("insert into person(name,age) values ('aa',4)");
//推荐
db.execSQL("insert into person(name,age) values(?,?)",new Object[] {"aa",4});
db.close();
db.execSQL(String sql,Object[] bindArgs)方法,第一个参数为SQL语句,第二个参数为SQL语句中占位符的位置,参数值在数组中的位置要和占位符对应。
Cursor cursor = db.rawQuery("select * from person",null);
while (cursor.moveToNext()){
int personid = cursor.getInt(0);//获取第一列的值,索引从0开始
String name = cursor.getString(1);
}
cursor.close();
db.close();
关于Cursor:
当执行查询语句的时候,返回值是一个Cursor对象,Cursor也提供了一些方法来移动查询结果的记录指针。
1.move(int offset) //讲治镇吸纳上或向下移动指定的行数,offset是整数就是向下,负数就是向上 2.moveToFirst() //移动到第一行,成功则返回true 3.moveToLast() //移动到最后一行 4.moveToNext() //移动到下一行 5.moveToPosition(position) //移动到指定的行 6.moveToPrevious() //向上移动一行 7.一旦将记录指针移动到指定行后,接下来就可以调用Cursor对象的getXXX()了方法来获得该行的记录了
//返回一个字符串数组的列名
String[] arrColumnName = cursor.getColumnNames();
while (cursor.moveToNext()) {
Map<String, Object> map = new HashMap<String, Object>();
for (int i = 0; i < arrColumnName.length; i++) {
Object colume_value = null;
//cursor.getType()返回光标的类型
switch (cursor.getType(i)) {
case 1:
colume_value = cursor.getInt(i);
break;
case 2:
colume_value = cursor.getFloat(i);
break;
case 3:
colume_value = cursor.getString(i);
break;
case 4:
colume_value = cursor.getBlob(i);
break;
default:
break;
}
map.put(arrColumnName[i], colume_value);
}
list.add(map);
}