加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用SQLite方式存储数据

发布时间:2020-12-12 19:55:50 所属栏目:百科 来源:网络整理
导读:声明:本文参考N篇文章所该,并加上自己的理解。由于参考博文很多,所以可能某些地方忘记注明转载出处,还望原作者见谅。 1.SQL基本命令 **(重点) 转自: http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html 。 SQL是与关系型数据库通信的唯一

声明:本文参考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,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=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.52php.cn/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);
或者调用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);

2.6关闭数据库

关闭数据库很重要,也是大家经常容易忘记的。关闭的方法很简单,直接使用SQLiteDatabase 的 close 方法。具体代码如下:

mSQLiteDatabase.close();
2.7删除指定表

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

mSQLiteDatabase.execSQL("DROP TABLE table1");

2.8删除数据库

要删除一个数据库,直接使用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使用方法: 转自:http://www.cnblogs.com/xirihanlin/archive/2009/08/07/1540906.html http://www.52php.cn/article/p-tmsxohqh-mp.html
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"
                 */

	}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读