声明:本文参考N篇文章所该,并加上自己的理解。由于参考博文很多,所以可能某些地方忘记注明转载出处,还望原作者见谅。
1.sql基本命令 **(重点)
转自:http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html。
sql是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。
在讲解sql基本命令之前,有必要先了解一下sqlite所支持的数据类型都有哪些。
sqlite采用动态数据存储类型,会根据存入的值自动进行判断。sqlite支持以下5种数据类型:
(1)NULL:空值
(2)INTEGER:带符号的整型
(3)REAL:浮点型
(4)TEXT:字符串文本
(5)BLOB:二进制对象
也支持以下类型:
smallint 16 位元的整数
interger 32 位元的整数
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值 ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度固定的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。 这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
1.2sql基本命令
表是探索sqlite中sql的起点,也是关系型数据库中信息的标准单位,所有的操作都是以表为中心的。那么如何使用sql命令创建一张表呢?
1.2.1创建表
表是由行和列组成的,列称为字段,行称为记录。
使用CREATE命令可以创建表,CREATE命令的一般格式为:
CREATE[TEMP/TEMPORARY]TABLEtable_name(column_definitions[,constraints(约束的意思)@H_403_133@]);
其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。
CREATETABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。
一条创建表的命令示例如下:
1 CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT,2 studentName VARCHAR(20),3 studentAge );
如上,我们创建了一个名为tab_student的表,该表包含3个字段:studentId、studentName和studentAge,其数据类型分别为:INTEGER、VARCHAR(也可不加数字)和INTEGER。
此外,通过使用关键字PRIMARYKEY,我们指定了字段studentId所在的列是主键。主键确保了每一行记录在某种方式上与表中的其他行记录是不同的(唯一的),进而确保了表中的所有字段都是可寻址的。
sqlite为主键提供自增长功能,当定义字段类型为INTEGERPRIMARYKEY时,sqlite将为该字段创建默认值,该默认值确保整数值是唯一的。sqlite使用64-bit单符号整数主键,因此,该字段的最大值是9,223,372,036,854,775,807。当达到最大值时,sqlite会自动搜索该字段还未使用的值,并作为要插入的值。从表中删除记录时,rowid可能被回收并在后面的插入中使用。因此,新创建的rowid不一定是按照严格顺序增长的。如果想要sqlite使用唯一的自动主键值,而不是填补空白,可以在主键定义INTEGERPRIMARYKEY中加入关键字AUTOINCREMENT。AUTOINCREMENT关键字阻止rowid回收,它将为新插入的记录产生新的(不是回收的)rowid。
1.2.2插入记录
使用INSERT命令可以一次插入一条记录,INSERT命令的一般格式为:
INSERTINTOtab_name(column_list)VALUES(value_list);
其中,tab_name指明将数据插入到哪个表中,column_list是用逗号分隔的字段名称,这些字段必须是表中存在的,value_list是用逗号分隔的值列表,这些值是与column_list中的字段一一对应的。
比如,向刚才创建的tab_student表中插入一条记录,便可以使用如下的语句完成:
INSERT INTO tab_student (studentId,studentName,studentAge) VALUES (1,“jack”,23);
通过以上的语句,便插入了一条studentName=”jack”,studentAge=”23”的记录,该记录的主键为studentId=1。
1.2.3更新记录
使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为:
UPDATEtab_nameSETupdate_listWHEREpredicate;
其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。
比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:
UPDATE tab_student SET studentName=”tom”,studentAge=”25” WHERE studentId=1;
通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”,studentAge=”25”了。
1.2.4删除记录
使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为:
DELETEFROMtable_nameWHEREpredicate;
其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。
比如,要删除刚才插入的记录,便可以使用如下的语句完成:
DELETE FROM tab_student WHERE studentId=1;
SELECT命令是查询数据库的唯一命令。SELECT命令也是sql命令中最大、最复杂的命令。
SELECT命令的通用形式如下:
SELECT[distinct]heading
FROMtables
WHEREpredicate 比如:WHEREId=2ANDdayLight=0
GROUPBYcolumns
HAVINGpredicate
ORDERBYcolumns
LIMITcount,offset;
其中,每个关键字(如FROM、WHERE、HAVING等)都是一个单独的子句,每个子句由关键字和跟随的参数构成。GROUPBY和HAVING一起工作可以对GROUPBY进行约束。ORDERBY使记录集在返回之前按一个或多个字段的值进行排序,可以指定排序方式为ASC(默认的升序)或DESC(降序)。此外,还可以使用LIMIT限定结果集的大小和范围,count指定返回记录的最大数量,offset指定偏移的记录数。
在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可选的。目前最常用的SELECT命令由三个子句组成:SELECT、FROM、WHERE,其基本语法形式如下:
SELECTheadingFROMtablesWHEREpredicate;
SELECT * FROM table_name; //会列出表的所有数据
SELECT column1,column2,columnN FROM table_name; //会查询出表中所有行的column1、column2、column3列的信息
比如,要查询刚才插入的记录,便可以使用如下的语句完成:添加where字句
SELECT studentId,studentAge FROM tab_student WHERE studentId=1; //只查id为1的...
至此,我们介绍了sql中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。当然了,这里只是对其进行了简单的介绍,有关sqlite中sql命令的详细使用方法,可以参阅《sqlite权威指南》一书的第三章和第四章。
补充:最后记得查看sql详细讲解及实际举例应用:http://www.jb51.cc/article/p-kwaofeyl-tu.html *********
2.sqliteDatabase的使用
对数据库的操作可以直接使用相应的sql语句,Android也为不熟悉sql语句的开发者提供了相应的封装方法,所以一般都有两种法。
以下转自:http://www.sqlite.com.cn/MySqlite/4/564.Html
2.1创建和打开数据库
在Android 中创建和打开一个数据库都可以使用openOrCreateDatabase 方法来实现,因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;创建成功则返回一个 sqliteDatabase对象,否则抛出异常FileNotFoundException。下面我们来创建一个名为”Examples_06_05.db”的数据库,并返回一个sqliteDatabase对象 msqliteDatabase。
msqliteDatabase = this.openOrCreateDatabase("Example_06_05.db",MODE_PRIVATE,null);
public static sqliteDatabase openOrCreateDatabase (String path,sqliteDatabase.CursorFactory factory)
一个数据库中可以包含多个表,我们的每一条数据都保存在一个指定的表中,要创建表可以通过execsql 方法来执行一条sql语句。execsql能够执行大部分的sql语句,下面我们来创建一个名为table1 且包含3个字段的表。 具体代码如下:
String CREATE_TABLE = "CREATE TABLE table1 (_id INTEGER PRIMARY KEY,num INTEGER,data TEXT)"; msqliteDatabase.execsql(CREATE_TABLE);
可以使用insert 方法来添加数据,但是 insert 方法要求把数据都打包到 ContentValues 中, ContentValues 其实就是一个Map, key值是字段名称, Value值是字段的值。通过 ContentValues 的 put 方法就可以把数据放到ContentValues中,然后插入到表中去。具体实现如下:
ContentValues cv = new ContentValues(); cv.put(TABLE_NUM,1); cv.put(TABLE_DATA,"测试数据"); msqliteDatabase.insert(TABLE_NAME,null,cv); //这样同样可以使用execsql方法来执行一条“插入”的sql语句,代码如下: String INSERT_DATA = "INSERT INTO table1 (_id,num,data) values (1,1,'通过sql语句插入')" ; msqliteDatabase.execsql(INSERT_DATA);
要删除数据可以使用delete 方法,下面我们删除字段 “_id” 等于1的数据,具体代码如下:
msqliteDatabase.delete("Examples_06_05.db"," where_id="+0,null); //或者通过 execsql方法执行sql语句删除数据如下: String DELETE_DATA = "DELETE FROM table1 WHERE _id=1"; msqliteDatabase.execsql(DELETE_DATA);
如果添加了数据后发现数据有误,这时需要修改这个数据,可以使用updata方法来更新一条数据。下面我们来修改 “num” 值为0的数据,具体代码如下:
ContentValues cv = new ContentValues(); cv.put(TABLE_NUM,3); cv.put(TABLE_DATA,"修改后的数据"); msqliteDatabase.update("table1",cv,"num " + "=" + Integer.toString(0),null);
关闭数据库很重要,也是大家经常容易忘记的。关闭的方法很简单,直接使用sqliteDatabase 的 close 方法。具体代码如下:
msqliteDatabase.close();
要删除一个数据库,直接使用deleteDatabase方法即可,具体代码如下:
this.deleteDatabase("Examples_06_05.db");
public DatabaseHelper(Context context,String name,CursorFactory factory,int version)
onCreate(sqliteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
onUpgrade(sqliteDatabse dv,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
onCreate方法:
调用sqliteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的sqliteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着自动调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
onUpgrade()方法:
onUpgrade()方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的需要,修改了数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(或其他数值),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
我们是在sqliteOpenHelper的构造方法参数中,传入这个版本号。通过修改这个版本号,来自动实现onUpgrade升级
dbHelper = new myDbHelper(context,DATABASE_NAME,DATABASE_VERSION); sqliteDatabase db; try { db = dbHelper.getWritableDatabase(); } catch (sqliteException ex) { db = dbHelper.getReadableDatabase(); }在后台,如果数据库不存在,辅助类会执行它的onCreate方法。如果数据库的版本发生了变化,onUpgrade 方法会触发。在两种情况下, get<Read/Write>ableDatabase 的调用会相应的返回已经存在的、新创建的或者更新了的数据库。
public class MysqLiteHelper extends sqliteOpenHelper { public MysqLiteHelper(Context context,int version) { super(context,name,factory,version); // TODO Auto-generated constructor stub } public MysqLiteHelper(Context context,int version,DatabaseErrorHandler errorHandler) { super(context,version,errorHandler); // TODO Auto-generated constructor stub } @Override public void onCreate(sqliteDatabase arg0) { // TODO Auto-generated method stub //自动被调用 //通常是在该方法里创建多个表,以备当调用getWritableDatabase或ReadableDatabase时,没有表而被系统自动调用创建表 arg0.execsql("CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT"+ "studentName VARCHAR(20)"+ "studentAge INTEGER)"); } @Override public void onUpgrade(sqliteDatabase db,int newVersion) { // TODO Auto-generated method stub //当版本号不一致时会自动调用 /* * 好方便我们对数据库进行升级,比如,更换表的操作,或是升级数据库时,把表全部删除进行重建等操作。 * sql升级语句,比如:"DROP TABLE IF EXISTS "+ "TableName" */ } }