SQLiteOpenHelper(转)

基本概念

Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类

基本用法

在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法。

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

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

还有一个方法选用:

onOpen() :当每次打开数据库时被调用。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MySQLiteHelper extends SQLiteOpenHelper{
//调用父类构造器
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}

/**
* 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.
* 重写onCreate方法,调用execSQL方法创建表
* */
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table if not exists hero_info(”
+ “id integer primary key,”
+ “name varchar,”
+ “level integer)”);

}

//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

}
当需要创建或打开一个数据库并获得数据库对象时,首先根据指定的文件名创建一个辅助对象,然后调用该对象的getWritableDatabase 或 getReadableDatabase方法 获得SQLiteDatabase 对象。

SQLiteDatabase db = myHelper.getWritableDatabase();
SQLiteDatabase db = myHelper.getReadableDatabase();

一般情况下两者返回情况都是相同的,唯一的区别是:在数据库仅开放只读权限或磁盘已满时,getReadableDatabase只会返回一个只读的数据库对象。

1
2
3
//创建MySQLiteOpenHelper辅助类对象
MySQLiteHelper myHelper = new MySQLiteHelper(this, “my.db”, null, 1);
SQLiteDatabase db = myHelper.getWritableDatabase();
以上运行结果是数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases

使用SQLiteOpenHelper创建管理SD卡中的数据库

使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限:
(1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databases中(可使用Eclispe的DDMS查看)。
(2)如果无法获取Root权限,则无法直接查看创建的数据库。

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
通过参数context,可以设置成sd卡上创建数据库

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

public class MySQLiteHelper extends SQLiteOpenHelper{
private static final String TAG = “MySQLiteHelper”;

/**
* 调用父类构造器
* @param context
* @param name
* @param factory
* @param version
*/
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}

/**
* 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.
* 重写onCreate方法,调用execSQL方法创建表
* */
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, “==onCreate==”);
db.execSQL(“create table if not exists hero_info(”
+ “id integer primary key,”
+ “name varchar,”
+ “level integer)”);

}

//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

}
import java.io.File;
import java.io.IOException;

import android.content.Context;
import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

/**
* 用于支持对存储在SD卡上的数据库的访问
**/
public class DatabaseContext extends ContextWrapper {

private Context mContext;
private String dirName;

/**
* 构造函数
*
* @param base
* 上下文环境
*/
public DatabaseContext(Context base) {
super(base);
this.mContext = base;
}
/**
* 构造函数
* @param base
* @param dirName
*/
public DatabaseContext(Context base, String dirName) {
super(base);
this.mContext = base;
this.dirName = dirName;
}

/**
* 获得数据库路径,如果不存在,则创建对象对象
*
* @param name
* @param mode
* @param factory
*/
@Override
public File getDatabasePath(String name) {
// 判断是否存在sd卡
boolean sdExist = android.os.Environment.MEDIA_MOUNTED
.equals(android.os.Environment.getExternalStorageState());
if (!sdExist) {// 如果不存在,
Log.e(“SD卡管理:”, “SD卡不存在,请加载SD卡”);
return null;
} else {// 如果存在
// 获取sd卡路径
String dbDir = android.os.Environment.getExternalStorageDirectory()
.getAbsolutePath();
dbDir += “/” + ((dirName == null || “”.equals(dirName)) ?
mContext.getPackageName() : dirName);// 数据库所在目录
String dbPath = dbDir + “/” + name;// 数据库路径
// 判断目录是否存在,不存在则创建该目录
File dirFile = new File(dbDir);
if (!dirFile.exists())
dirFile.mkdirs();

  // 数据库文件是否创建成功
  boolean isFileCreateSuccess = false;
  // 判断文件是否存在,不存在则创建该文件
  File dbFile = new File(dbPath);
  if (!dbFile.exists()) {
    try {
      isFileCreateSuccess = dbFile.createNewFile();// 创建文件
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  } else
    isFileCreateSuccess = true;

  // 返回数据库文件对象
  if (isFileCreateSuccess)
    return dbFile;
  else
    return null;
}

}

/**
* 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
*
* @param name
* @param mode
* @param factory
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
SQLiteDatabase.CursorFactory factory) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name), null);
return result;
}

/**
* Android 4.0会调用此方法获取数据库。
*
* @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String,
* int, android.database.sqlite.SQLiteDatabase.CursorFactory,
* android.database.DatabaseErrorHandler)
* @param name
* @param mode
* @param factory
* @param errorHandler
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory, DatabaseErrorHandler errorHandler) {
SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(
getDatabasePath(name), null);
return result;
}
}
调用代码是:

1
2
DatabaseContext dbContext = new DatabaseContext(this,”dbdemo”);
myHelper = new MySQLiteHelper(dbContext, “my.db”, null, 1);
特别注意的是不同版本的android API会调用不同的openOrCreateDatabase函数。

最后加入对SD卡的读写权限:

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值