使用SQLite方式存储数据

前端之家收集整理的这篇文章主要介绍了使用SQLite方式存储数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

声明:本文参考N篇文章所该,并加上自己的理解。由于参考博文很多,所以可能某些地方忘记注明转载出处,还望原作者见谅。


1.sql基本命令 **(重点)

转自:http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html

  sql是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。

  在讲解sql基本命令之前,有必要先了解一下sqlite所支持的数据类型都有哪些。

1.1sqlite支持的数据类型

  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(约束的意思)]);

  其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。

  CREATETABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。

  一条创建表的命令示例如下:

1   CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT,@H_301_189@2                             studentName VARCHAR(20),@H_301_189@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=25WHERE 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;

1.2.5查询记录 查看下文补充链接

  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

@H_301_538@2.1创建和打开数据库

在Android 中创建和打开一个数据库都可以使用openOrCreateDatabase 方法来实现,因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;创建成功则返回一个 sqliteDatabase对象,否则抛出异常FileNotFoundException。下面我们来创建一个名为”Examples_06_05.db”的数据库,并返回一个sqliteDatabase对象 msqliteDatabase。

msqliteDatabase = this.openOrCreateDatabase("Example_06_05.db",MODE_PRIVATE,null);
或者调用sqliteDatabae静态方法
public static sqliteDatabase openOrCreateDatabase (String path,sqliteDatabase.CursorFactory factory)

2.2创建表

一个数据库中可以包含多个表,我们的每一条数据都保存在一个指定的表中,要创建表可以通过execsql 方法来执行一条sql语句。execsql能够执行大部分的sql语句,下面我们来创建一个名为table1 且包含3个字段的表。 具体代码如下:

String CREATE_TABLE = "CREATE TABLE table1 (_id INTEGER PRIMARY KEY,num INTEGER,data TEXT)"; msqliteDatabase.execsql(CREATE_TABLE);
2.3向表中添加一条数据

可以使用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);


2.4从表中删除数据

删除数据可以使用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);


2.5修改表中的数据

如果添加了数据后发现数据有误,这时需要修改这个数据,可以使用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();
2.7删除指定表

这里我们使用execsql方法来实现,具体代码如下:

msqliteDatabase.execsql("DROP TABLE table1");

删除一个数据库,直接使用deleteDatabase方法即可,具体代码如下:

this.deleteDatabase("Examples_06_05.db");


2.9补充:查询数据库***

方法一:public Cursor query(boolean distinctString table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

参数说明:

distinct:使返回的结果是原结果的一个不含相同行的子集。比如订单表中,一个客户可能会有好几份订单,因此客户的名字会重复出现。

table:数据库表的名称

columns:数据库名称数组 写入后最后返回的Cursor中只能查到这里的列的内容 (举例:new String[] {"name","hp"} 这样的话得到的Cursor 中的数据只会存有 数据库表中"name " 与 "hp"两个字段)

selection:查询条件 相当于条件字句,比如"id=?""namelike ?" //红色代表关键字

selectionArgs: 相当于条件字句的参数值 比如newString[]{"1"} new String[]{"%传智%"}

groupBy:分组列 相当于select语句group by关键字后面的部分 常用来做统计。 //不常用,常置为null

having:分组条件 相当于select语句having关键字后面的部分 用来做统计结果的条件限制

orderBy:排序列 相当于select语句order by关键字后面的部分,如:“personid desc“(按personid倒序排,从大到小),“age asc”(按age正序排,从小到大);

limit:分页查询限制 指定偏移量和获取的记录数 比如limit 0,10表示从第0条记录开始,往后一共读取10条。


方法二:rawQuery(Stringsql,String[]selectionArgs) 直接使用sql语句查询。 <raw意思是“生的,未加工处理的”>

2.10补充:Cursor
cursor类似一个集合,会把符合条件的查询结果,重新排列。
可以通过moveToNext()遍历整张查询结果表。
其他方法看android API




3.sqliteOpenHelper的使用
3.1介绍:
sqliteOpenHelper是一个数据库管理的帮助类,提供了创建数据库的接口,并且更重要的是有数据库的版本更新功能
由于sqliteOpenHelper只是一个辅助类。对数据库的具体操作还是通过sqliteDatabase来操作的。
在使用中,也可以不使用这个类,而直接使用sqliteDatabase。如果使用这个类,则可以更好的帮助我们管理数据库
sqliteOpenHelper经常和ContentProvider结合使用。

sqliteOpenHelper是一个抽象类,有两个重要方法分别是 onCreate(sqliteDatabase db)和onUpgrade(sqliteDatabase db,int oldVersion,int newVersion)。


3.2使用方法
3.2.1所有继承了这个类的类都必须实现下面这样的一个构造方法
public DatabaseHelper(Context context,String name,CursorFactory factory,int version)

3.2.2实现两个抽象方法

onCreate(sqliteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。

onUpgrade(sqliteDatabse dv,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用方法


3.2.3方法祥述
onCreate方法
调用sqliteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库sqliteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着自动调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

onUpgrade()方法

onUpgrade()方法数据库的版本发生变化时会被调用数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的需要,修改数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(或其他数值),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
我们是在sqliteOpenHelper的构造方法参数中,传入这个版本号。通过修改这个版本号,来自动实现onUpgrade升级


注意:
onCreate
onUpgrade()都是当满足特定条件,由系统自己调用的。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库sqliteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
这时可以采用如下:
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 调用会相应的返回已经存在的、新创建的或者更新了的数据库

3.3sqliteOpenHelper代码Demo:
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"
                 */

	}

}

猜你在找的Sqlite相关文章