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

本文主要是说明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学习一点帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值