Android-SQLite和SQLiteOpenHelper

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android-SQLite和SQLiteOpenHelper相关的知识,希望能为你提供帮助。
参考:
Android 操作SQLite基本用法
demo的GitHub地址: https://github.com/Ablexq/MyGreenDao
一、 SQLite介绍 SQLite是android内置的一个很小的关系型数据库。
SQLite的官网是http://www.sqlite.org/, 可以去下载一些文档或相关信息。
SQLite的特点: 【Android-SQLite和SQLiteOpenHelper】轻量级
SQLite和C/S模式的数据库软件不同, 它是进程内的数据库引擎, 因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态 库, 就可以享受它的全部功能。而且那个动态库的尺寸也挺小, 以版本3.6.11为例, Windows下487KB、Linux下347KB。
不需要”安装”
SQLite的核心引擎本身不依赖第三方的软件, 使用它也不需要”安装”。有点类似那种绿色软件。
单一文件
数据库中所有的信息( 比如表、视图等) 都包含在一个文件内。这个文件可以自由复制到其它目录或其它机器上。
跨平台/可移植性
除了主流操作系统 windows, linux之后, SQLite还支持其它一些不常用的操作系统。
弱类型的字段
同一列中的数据可以是不同类型
开源
SQLite数据类型 一般数据采用的固定的静态数据类型, 而SQLite采用的是动态数据类型, 会根据存入值自动判断。SQLite具有以下几种常用的数据类型:

NULL: 这个值为空值VARCHAR(n): 长度不固定且其最大长度为 n 的字串, n不能超过 4000。CHAR(n): 长度固定为n的字串, n不能超过 254。INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据块, 以输入的数据格式进行存储。如何输入就如何存储,不改变格式。DATA : 包含了 年份、月份、日期。TIME: 包含了 小时、分钟、秒。

SQLiteDatabase的介绍 Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象, 提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具, 我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。
//SQLiteDatabase的常用方法 openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryfactory) 打开或创建数据库insert(String table,String nullColumnHack,ContentValuesvalues) 插入一条记录delete(String table,String whereClause,String[]whereArgs) 删除一条记录query(String table,String[] columns,String selection,String[]selectionArgs,String groupBy,String having,StringorderBy) 查询一条记录update(String table,ContentValues values,String whereClause,String[]whereArgs) 修改记录execSQL(String sql) 执行一条SQL语句close() 关闭数据库

二、 SQLiteOpenHelper的使用方法 SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。
可以通过继承这个类, 实现它的一些方法来对数据库进行一些操作。
所有继承了这个类的类都必须实现下面这样的一个构造方法:
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
第一个参数: Context类型, 上下文对象。
第二个参数: String类型, 数据库的名称
第三个参数: CursorFactory类型
第四个参数: int类型, 数据库版本
SQLiteOpenHelper 类的使用步骤:
1、 创建SQLiteOpenHelper类的子类mysqliteOpenHelper 类, 实现SQLiteOpenHelper类中的抽象方法onCreate()和onUpgrade();
//打开或者创建数据库 db= SQLiteDatabase.openOrCreateDatabase(" /data/data/com.lingdududu.db/databases/stu.db" ,null);

2、调用 MySQLiteOpenHelper 对象的getWritableDatabase 或 getReadableDatabase方法, 获得SQLiteDatabase 对象;
MySQLiteOpenHelper dbHelper= new MySQLiteOpenHelper(getContext()); SQLiteDatabase db = dbHelper.getReadableDatabase(); // 磁盘满了依然可读

注意:
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
但getWritableDatabase() 方法以写方式打开数据库, 一旦数据库的磁盘空间满了, 数据库就只能读而不能写, 倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库, 如果数据库的磁盘空间满了, 就会打开失败, 当打开失败后会继续尝试以只读方式打开数据库。
因此建议使用getReadableDatabase()方法来获打开数据库。
3、创建表。实际上是执行DML操作的Create;
private void createTable(SQLiteDatabase db){ //创建表SQL语句 String stu_table= " create table usertable(_id integer primary key autoincrement,sname text,snumber text)" ; //执行SQL语句 db.execSQL(stu_table); }

4、调用SQLiteDatabase 对象的execSQL()方法, 执行 update, insert, delete操作; 调用rawQuery()方法执行select查询操作;
5、 如果执行的是查询操作, 则对返回的Cursor进一步处理。
6、关闭db , 关闭cursor。
插入数据:
//插入数据方法一 private void insert(SQLiteDatabase db){ //实例化常量值 ContentValues cValue = new ContentValues(); //添加用户名 cValue.put(" sname" ," xiaoming" ); //添加密码 cValue.put(" snumber" ," 01005" ); //调用insert()方法插入数据 db.insert(" stu_table" ,null,cValue); }//插入数据方法二 private void insert(SQLiteDatabase db){ //插入数据SQL语句 String stu_sql= " insert into stu_table(sname,snumber) values(' xiaoming' ,' 01005' )" ; //执行SQL语句 db.execSQL(sql); }

删:
//删除方法一 private void delete(SQLiteDatabase db) { //删除条件 String whereClause = " id= ?" ; //删除条件参数 String[] whereArgs = {String.valueOf(2)}; //执行删除 db.delete(" stu_table" ,whereClause,whereArgs); }//删除方法二 private void delete(SQLiteDatabase db) { //删除SQL语句 String sql = " delete from stu_table where _id = 6" ; //执行SQL语句 db.execSQL(sql); }

修改:
修改方法一: private void update(SQLiteDatabase db) { //实例化内容值 ContentValues values = new ContentValues(); //在values中添加内容 values.put(" snumber" ," 101003" ); //修改条件 String whereClause = " id= ?" ; //修改添加参数 String[] whereArgs= {String.valuesOf(1)}; //修改 db.update(" usertable" ,values,whereClause,whereArgs); }//修改方法二: private void update(SQLiteDatabase db){ //修改SQL语句 String sql = " update stu_table set snumber = 654321 where id = 1" ; //执行SQL db.execSQL(sql); }

//查询方法一: //参数1: 表名 //参数2: 要想显示的列 //参数3: where子句 //参数4: where子句对应的条件值 //参数5: 分组方式 //参数6: having条件 //参数7: 排序方式 Cursor cursor = db.query(" stu_table" , new String[]{" id" , " sname" , " sage" , " ssex" }, " id= ?" , new String[]{" 1" }, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(" sname" )); String age = cursor.getString(cursor.getColumnIndex(" sage" )); String sex = cursor.getString(cursor.getColumnIndex(" ssex" )); System.out.println(" query-------> " + " 姓名: " + name + " " + " 年龄: " + age + " " + " 性别: " + sex); }//查询方法二: //查询数据: 返回的是一个Cursor对象 public Cursor query() { String sql = " select * from people" ; //获取SQLiteDatabase对象实例 db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, null); return cursor; }

删除指定表
private void drop(SQLiteDatabase db){ //删除表的SQL语句 String sql = " DROP TABLE stu_table" ; //执行SQL db.execSQL(sql); }

示例: StuDBHelper .java
package com.example.test.demo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * Created by Administrator on 2017/5/12. */public class StuDBHelper extends SQLiteOpenHelper {//这是一个辅助类, 用来管理数据库的创建和数据库的版本。private static final String TAG = " TestSQLite" ; public static final int VERSION = 1; /*必须带有构造方法*/ public StuDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); }/*在数据库第一次生成的时候会调用这个方法, 也就是说, 只有在创建数据库的时候才会调用, 当然也有一些其它的情况, 一般我们在这个方法里边生成数据库表。*/ @ Override public void onCreate(SQLiteDatabase db) { String sql = " create table stu_table(id int,sname varchar(20),sage int,ssex varchar(10))" ; //输出创建数据库的日志信息 Log.i(TAG, " create Database-------------> " ); //execSQL函数用于执行SQL语句 db.execSQL(sql); }/*当数据库需要升级的时候, Android系统会主动的调用这个方法。 一般我们在这个方法里边删除数据表, 并建立新的数据表, 当然是否还需要做其他的操作, 完全取决于应用的需求。*/ @ Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //输出更新数据库的日志信息 Log.i(TAG, " update Database-------------> " ); } }

SQLiteActivity .java
package com.example.test.demo; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.example.test.R; /** * Created by Administrator on 2017/5/12. */public class SQLiteActivity extends Activity { //声明各个按钮 private Button createBtn; private Button insertBtn; private Button updateBtn; private Button queryBtn; private Button deleteBtn; private Button ModifyBtn; @ Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //调用creatView方法 creatView(); //setListener方法 setListener(); }//通过findViewById获得Button对象的方法 private void creatView() { createBtn = (Button) findViewById(R.id.createDatabase); updateBtn = (Button) findViewById(R.id.updateDatabase); insertBtn = (Button) findViewById(R.id.insert); ModifyBtn = (Button) findViewById(R.id.update); queryBtn = (Button) findViewById(R.id.query); deleteBtn = (Button) findViewById(R.id.delete); }//为按钮注册监听的方法 private void setListener() { createBtn.setOnClickListener(new CreateListener()); updateBtn.setOnClickListener(new UpdateListener()); insertBtn.setOnClickListener(new InsertListener()); ModifyBtn.setOnClickListener(new ModifyListener()); queryBtn.setOnClickListener(new QueryListener()); deleteBtn.setOnClickListener(new DeleteListener()); }//创建数据库的方法------------------------------------------------------------------------------ class CreateListener implements View.OnClickListener {@ Override public void onClick(View v) { //创建StuDBHelper对象 StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); //得到一个可读的SQLiteDatabase对象 SQLiteDatabase db = dbHelper.getReadableDatabase(); } }//更新数据库的方法------------------------------------------------------------------------------ class UpdateListener implements View.OnClickListener {@ Override public void onClick(View v) { // 数据库版本的更新,由原来的1变为2 StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); SQLiteDatabase db = dbHelper.getReadableDatabase(); } }//插入数据的方法------------------------------------------------------------------------------ class InsertListener implements View.OnClickListener {@ Override public void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); //得到一个可写的数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); //生成ContentValues对象 //key:列名, value:想插入的值 ContentValues cv = new ContentValues(); //往ContentValues对象存放数据, 键-值对模式 cv.put(" id" , 1); cv.put(" sname" , " xiaoming" ); cv.put(" sage" , 21); cv.put(" ssex" , " male" ); //调用insert方法, 将数据插入数据库 db.insert(" stu_table" , null, cv); //关闭数据库 db.close(); } }//查询数据的方法------------------------------------------------------------------------------ class QueryListener implements View.OnClickListener {@ Override public void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); //得到一个可写的数据库 SQLiteDatabase db = dbHelper.getReadableDatabase(); //参数1: 表名 //参数2: 要想显示的列 //参数3: where子句 //参数4: where子句对应的条件值 //参数5: 分组方式 //参数6: having条件 //参数7: 排序方式 Cursor cursor = db.query(" stu_table" , new String[]{" id" , " sname" , " sage" , " ssex" }, " id= ?" , new String[]{" 1" }, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(" sname" )); String age = cursor.getString(cursor.getColumnIndex(" sage" )); String sex = cursor.getString(cursor.getColumnIndex(" ssex" )); System.out.println(" query-------> " + " 姓名: " + name + " " + " 年龄: " + age + " " + " 性别: " + sex); } //关闭数据库 db.close(); } }//修改数据的方法------------------------------------------------------------------------------ class ModifyListener implements View.OnClickListener {@ Override public void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); //得到一个可写的数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(" sage" , " 23" ); //where 子句 " ?" 是占位符号, 对应后面的" 1" , String whereClause = " id= ?" ; String[] whereArgs = {String.valueOf(1)}; //参数1 是要更新的表名 //参数2 是一个ContentValeus对象 //参数3 是where子句 db.update(" stu_table" , cv, whereClause, whereArgs); } }//删除数据的方法------------------------------------------------------------------------------ class DeleteListener implements View.OnClickListener {@ Override public void onClick(View v) {StuDBHelper dbHelper = new StuDBHelper(SQLiteActivity.this, " stu_db" , null, 2); //得到一个可写的数据库 SQLiteDatabase db = dbHelper.getReadableDatabase(); String whereClauses = " id= ?" ; String[] whereArgs = {String.valueOf(2)}; //调用delete方法, 删除数据 db.delete(" stu_table" , whereClauses, whereArgs); } } }


    推荐阅读