SQLiteOpenHelper类

原创 2016年08月29日 11:31:58
一、SQLiteOpenHelper类:SQLiteDatabase
(一)、引入:
在编写数据库应用软件时,需要考虑这样的问题:我们开发的软件如果应用使用到SQLite数据库,我们必须在用户初次使用软件时创建出数据库表结构及添加一些初始化记录;另外在软件升级的时候,也需要对数据表结构进行更新。
如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?
所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类。

SQLiteOpenHelper是系统提供的一个管理数据库表创建和版本管理(尤其是版本更新)的抽象类,我们必须通过继承SQLiteOpenHelper来实现自己的工具类。 一般我们要重写三个方法,构造器、onCreate方法、onUpgrade方法。

为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是:
onCreate(SQLiteDatabase db)
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

1、当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
2、onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。


(二)、SQLiteOpenHelper 类的使用步骤:【重点】
创建SQLiteOpenHelper类的子类MySQLiteOpenHelper 类,实现SQLiteOpenHelper类中的抽象方法onCreate()和onUpgrade();
调用 MySQLiteOpenHelper 对象的getWritableDatabase 或 getReadableDatabase方法,获得SQLiteDatabase 对象;
创建表。实际上是执行DML操作的Create;
调用SQLiteDatabase 对象的execSQL()方法,执行 update,insert,delete操作;调用rawQuery()方法执行select查询操作;
如果执行的是查询操作,则对返回的Cursor进一步处理。

(三)、SQLiteOpenHelper类中常用方法:
onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
【备注:】除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。
getWritableDatabase() 创建一个可读写数据库
getReadableDatabase() 创建一个可读写数据库
【备注:】调用getReadableDatabase 方法返回的并不总是只读数据库对象,一般来说该方法和getWriteableDatabase 方法的返回情况相同,只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。而getWriteableDatabase()方法打开的数据库,一旦数据库磁盘空间满了,就只能读而不能写,如果再写则报错。因此建议使用getReadableDatabase()方法来获打开数据库。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。


(四)、核心示例代码:

publicclass MySQLiteOpenHelper extends SQLiteOpenHelper {

privatefinalstatic String DBNAME = "db_words.db";
privatefinalstaticintVERSION = 1;
private SQLiteDatabase db = null;



public MySQLiteOpenHelper(Context context) {

super(context, DBNAME, null, VERSION);

getConnection();

}



@Override

publicvoid onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE tb_words (_id INTEGER PRIMARY KEY AUTOINCREMENT , word , detail)");
}



@Override

publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if (newVersion > oldVersion) {

db.execSQL("DROP TABLE IF EXISTS tb_words");
onCreate(db);

}

}


}

三、封装MySQLiteOpenHelper 类:
(一)、封装的目的:
为了工作方便,为了提高代码重用性,将重复写的代码封装起来。
封装的原则:要注意粒度和耦合性。要尽量做到耦合性低。

(二)、封装 MySQLiteOpenHelper 类的核心代码:

publicclass MySQLiteOpenHelper extends SQLiteOpenHelper {

privatefinalstatic String DBNAME = "db_words.db";
privatefinalstaticintVERSION = 1;
private SQLiteDatabase db = null;



public MySQLiteOpenHelper(Context context) {

super(context, DBNAME, null, VERSION);

getConnection();

}



@Override

publicvoid onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE tb_words (_id INTEGER PRIMARY KEY AUTOINCREMENT , word , detail)");
}



@Override

publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if (newVersion > oldVersion) {

db.execSQL("DROP TABLE IF EXISTS tb_words");
onCreate(db);

}

}



publicvoid getConnection() {

db = this.getReadableDatabase();

}



public Cursor selectCursor(String sql, String[] selectionArgs) {

returndb.rawQuery(sql, selectionArgs);

}



publicint selectCount(String sql, String[] selectionArgs) {

Cursor cursor = db.rawQuery(sql, selectionArgs);

if (cursor != null) {

int count = cursor.getCount();

cursor.close();

return count;

}

return 0;
}



public List<Map<String, Object>> selectData(String sql,

String[] selectionArgs) {

Cursor cursor = db.rawQuery(sql, selectionArgs);

return cursorToList(cursor);

}



public List<Map<String, Object>> cursorToList(Cursor cursor) {

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

String[] arrCols = cursor.getColumnNames();

while (cursor.moveToNext()) {

Map<String, Object> map = new HashMap<String, Object>();



for (int i = 0; i < arrCols.length; i++) {

int type = cursor.getType(i);

Object value = null;

switch (type) {

case 1:

value = cursor.getInt(i);

break;

case 2:

value = cursor.getFloat(i);

break;

case 3:

value = cursor.getString(i);

break;

case 4:

value = cursor.getBlob(i);

break;

default:
break;

}

map.put(arrCols[i], value);

}

list.add(map);

}

return list;

}



publicboolean updateData(String sql, Object[] bindArgs) {

try {

db.execSQL(sql, bindArgs);

returntrue;
} catch (Exception e) {

returnfalse;
}

}



publicvoid destroy() {

if (db != null) {

db.close();

}

}


}

(二)、核心代码:
webView_main = (WebView) findViewById(R.id.webView_main);
// 设置浏览器支持。这样webview可以处理各种通知和请求事件。
// 如果不使用该句代码,在点击超链地址后,会跳出程序,而弹出浏览器访问网页。
webView_main.setWebChromeClient(new WebChromeClient());
webView_main.setWebViewClient(new WebViewClient());

WebSettings webSetting = webView_main.getSettings();
webSetting.setJavaScriptEnabled(true); // 设置支持javascript脚本
webSetting.setAllowFileAccess(true); // 允许访问文件
webSetting.setBuiltInZoomControls(true); // 设置显示缩放按钮
webSetting.setSupportZoom(true); // 支持缩放

String data = "以下显示一张图片:<img src='file:///android_asset/图片名称及后缀' width='230dp'/>";
webView_main.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);


(二)、如何访问raw目录下的文件?
InputStream is = getResources().openRawResource(R.raw.文件名);





























版权声明:本文为博主原创文章,未经博主允许不得转载。

Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析

前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增、删、查、改) 目录1. SQLite数据库介绍 SQLite是Android内置的一...
  • carson_ho
  • carson_ho
  • 2016年11月20日 16:34
  • 6915

SQLiteOpenHelper对数据库进行版本管理

我们在编写数据库应用软件时,需要考虑这样的问题: 在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录 在软件升级的时候,也需要对数据表结构进行更新。 SQLiteOpenHe...
  • xiangrikui0109
  • xiangrikui0109
  • 2016年02月28日 17:58
  • 1433

Android SQLiteOpenHelper使用和源码详解

SQLiteOpenHelper在讲解闹钟数据库之前,需要先来分析一下SQLiteOpenHelper的源码,从而了解SQLite数据库的使用.使用方法大家在使用SQLiteOpenHelper的时候...
  • zinss26914
  • zinss26914
  • 2016年05月11日 15:34
  • 6372

Android学习笔记(12)————利用SQLiteOpenHelper来管理SQLite数据库

/********************************************************************************************  * aut...
  • conowen
  • conowen
  • 2012年03月01日 10:57
  • 38963

解析 SQLiteOpenHelper

“SQLiteOpenHelper” 是一个用来管理数据库的创建和版本管理的辅助类。它是一个抽象类,要使用它必须创建一个子类继承 SQLiteOpenHelper,并实现 onCreate,onUpg...
  • xiaomai949804781
  • xiaomai949804781
  • 2017年04月21日 13:23
  • 616

SQLiteOpenHelper

SQLiteOpenHelper与SQLiteDatabase生命周期学习 1      概述 SQLiteDatabase是安卓比较基础的数据库操作类。 SQLiteDatabase作为一个成员变...
  • xiushoupangguan
  • xiushoupangguan
  • 2014年03月17日 12:09
  • 1657

Android SQLiteDatabase帮助类SQLiteOpenHelper的使用

SQLiteOpenHelper是SQLiteDatabse的一个帮助类,用来管理数据的创建和版本更新。一般的用法是定义一个类继承SQLiteOpenHelper,并实现两个回调方法,OnCreate...
  • xiaanming
  • xiaanming
  • 2013年03月15日 21:25
  • 27266

SQLite使用方法 SQLiteOpenHelper操作

程序内使用SQLite数据库是通过SQLiteOpenHelper进行操作 1. 自己写个类继承SQLiteOpenHelper,重写以下3个方法 public void onCreate...
  • wangqilin8888
  • wangqilin8888
  • 2012年07月24日 15:15
  • 11962

Android-SQLiteOpenHelper使用示例

我们大家都知道Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的...
  • zouzhigang96
  • zouzhigang96
  • 2016年02月26日 14:32
  • 1263

Android之SQLiteOpenHelper

1.SQLiteOpenHelper   SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpg...
  • cycwind
  • cycwind
  • 2011年11月11日 16:54
  • 24777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQLiteOpenHelper类
举报原因:
原因补充:

(最多只允许输入30个字)