Android 数据库

一、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);
        }

 

posted @ 2015-08-24 15:35  ChHM  阅读(337)  评论(0编辑  收藏  举报