使用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 位元的整数 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表中插入一条记录,便可以使用如下的语句完成:
通过以上的语句,便插入了一条studentName=”jack”,studentAge=”23”的记录,该记录的主键为studentId=1。 1.2.3更新记录 使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为: UPDATEtab_nameSETupdate_listWHEREpredicate; 其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。 比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:
通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”,studentAge=”25”了。 1.2.4删除记录 使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为: DELETEFROMtable_nameWHEREpredicate; 其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。 比如,要删除刚才插入的记录,便可以使用如下的语句完成:
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字句
至此,我们介绍了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补充:查询数据库*** 方法二: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" */ } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |