您的位置:首页 > 移动开发 > Android开发

Android 首次创建数据库或者更新时,SQLiteOpenHelper的使用与解析

2016-01-20 10:53 836 查看
本文主要是说明Android提供的数据库创建以及更行助手SQLiteOpenHelper的初次使用以及具体方法解析。

首先谈谈SQLiteOpenHelper的由来,在我们首次安装App时需要新建一些本地数据表,而这些表只需要在第一次打开软件时才需要执行,在下一次就不需要新建了,就像App的欢迎界面,只会在首次打开APP时才会出现。或者是在软件升级时,可能需要更新一些表,比如删除旧表,添加新的本地表,SQLiteOpenHelper就是为解决这类问题而生。

说完用途,在来分析一下SQLiteOpenHelper这个类,在继承这个类时,需要实现

public class MySQLiteOpenHelp extends SQLiteOpenHelper {

//新建一个SQLiteOpenHelper的对象,在之后初始化时会用到
public static MySQLiteOpenHelp mySQLiteOpenHelp;
// 数据库版本号,在更新时系统便是根据version来判断,若version号低于则会启动升级程序
private static final int version = 1;

//设置你自己的数据库名称
public static final String DATABASE_NAME = "companyWorkManager.db";

//这是在初始化之后有增、删、改、查之后的需要时,需要借组SQLiteDatabase来进行操作

private static SQLiteDatabase dbForWrite;

private static SQLiteDatabase dbForRead;

//这里是构造方法,主要实现SQLiteOpenHelper的初始化工作,注意:若SQLiteOpenHelper没有初始化,则在使用时会报空指针异常
//即,需要明确指出Context即环境,否则会报NULLPOINT错误
//这是系统提供的初始化构造方法,你也可以使用虾下面的构造方法来实现数据库自己命名
public MySQLiteOpenHelp(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}

//自定义初始化方法,这样你就可以动态修改本地的数据库名称,一目了然。
public MySQLiteOpenHelp(Context context) {
super(context, DATABASE_NAME, null, version);
}

//初始化数据库位置,给了一个简单的创建实例。
@Override
public void onCreate(SQLiteDatabase db) {
String TABLECONTACTS = "create table contacts(" + "_id INTEGER  ," + // rowID
"name TEXT  NOT NULL," + // 姓名
"contactIcon BLOB," + // 联系人图标
"telPhone TEXT NOT NULL," + // 电话号码
"groupName TEXT," + // 所属组名
"birthday TEXT," + // 生日
"address TEXT," + // 地址
"email TEXT," + // 邮箱
"description TEXT," + // 好友描述
"createTime TEXT," + // 创建时间
"modifyTime TEXT" + // 修改时间
");";
db.execSQL(TABLECONTACTS);
}

//软件更新时升级数据库的位置
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

}
// 更新app时会加载该方法
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

}

// 创建或打开一个数据库。这和getWritableDatabase()返回的对象是同一个,
// 除非一些因素要求数据库只能以read-only的方式被打开,比如磁盘满了。
// 在这种情况下,一个只读的数据库对象将被返回。如果这个问题被修改掉,将来调用getWritableDatabase()就可能成功,而这时read-only数据库对象将被关闭,并且读写对象将被返回。

public static SQLiteDatabase getReadDatabase() {
if (dbForRead == null) {
dbForRead = mySQLiteOpenHelp.getReadableDatabase();
}
return dbForRead;
}

// 创建或打开一个数据库,用于读写。该方法第一次被调用的时候,数据库被打开,并且onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)
// 或onOpen(SQLiteDatabase)将被调用。
public static SQLiteDatabase getWriteDatabase() {
if (dbForWrite == null) {
dbForWrite = mySQLiteOpenHelp.getWritableDatabase();
}
return dbForWrite;
}

}


好了,我们已经创建了一个继承SQLiteOpenHelper类的数据库初始化类,由于初始化需要Context对象,即上下文环境,这时就需要在对应的Activity中加入初始化方法,我的在MainActivity

    // 初始化数据库
MySQLiteOpenHelp.mySQLiteOpenHelp = new MySQLiteOpenHelp(
MainActivity.this);


添加这一段方法就可以实现数据库的初始化了,再次执行时,MySQLiteOpenHelp中的Oncreat()的方法是不会执行的,所以不必担心再次建表的错误.
数据表初始化完成了,那么需要增、删、改、查操作怎么进行呢,这就需要用到SQLiteDatabase这个类了,是用于Android平台的数据库操作类。你可以新建一个独立的数据库操作类,我的是


public class MyDBOperation {

//相当于请求一个可以操作数据库的权限,得到之后你就可以操作了
SQLiteDatabase db = MySQLiteOpenHelp.getReadDatabase();

//这是相应的插入方法,你可以在下面添加额外的数据操作
public void insert_groups(MyGroups contactInfo) {
String formatTime=getSysNowTime();
ContentValues content=new ContentValues();
content.put("_id", contactInfo.getId());
content.put("name", contactInfo.getName());
content.put("birthday", contactInfo.getBirthday());
content.put("address", contactInfo.getAddress());
content.put("telPhone", contactInfo.getTelPhone());
content.put("email", contactInfo.getEmail());
content.put("contactIcon", contactInfo.getContactIcon());
content.put("description", contactInfo.getDescription());
content.put("groupName", contactInfo.getGroupName());
content.put("createTime", contactInfo.getCreateTime());
content.put("modifyTime", contactInfo.getModifyTime());
return db.insert(TABLE_CONTACTS, null, content);
}
}


在主表中使用时,你需要新建一个对象来实现方法

MyDBOperation db = new MyDBOperation();
db.insert_groups(tempGroup);


就可以将记录存入到本地数据库中去了,不清楚的需要多动手练习。

千万不要忘了SQLiteOpenHelper的初始化,需要把上下文环境给他 他才能初始化,否则会报空指针异常。

予人玫瑰,手有余香,知道这句出处的就会明白在那苦逼考研日子里,多希望在王道能获得多一点帮助的心情,愿此文能给你Android学习一点帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息