SQLiteOpenHelper基础使用

SQLiteOpenHelper在数据库版本变更时会触发onUpgrade()方法,用于更新表结构。通常不应直接删除并重建表,以免丢失用户数据。onCreate()在首次创建数据库时调用,onUpdate()则在升级时调用,需要先删除旧组件再创建新结构。onOpen()方法在每次打开数据库时调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class DatabaseHelper extends SQLiteOpenHelper {
    //类没有实例化,是不能用作父类构造器的参数,必须声明为静态
         private static final String name = "android"; //数据库名称
         private static final int version = 1; //数据库版本
         public DatabaseHelper(Context context) {
    //或者 public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version)
//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
          // name :   数据库文件名(不包括文件路径),SQLiteOpenHelper会根据这个文件名创建数据库文件
    // version: version表示数据库的版本号。供onUpgrade方法使用。
    如果是初次使用该软件,则第一次创建数据库,此时产生一个初始的版本号。接着调用onCreate()方法
    如果当前传入的数据库版本号比上次创建或升级的版本号高,SQLiteOpenHelper就会调用onUpdate()方法
     super(context, name, null, version);
         }
        @Override public void onCreate(SQLiteDatabase db) {
      //在数据库第一次生成的时候才会调用这个方法,一般我们在这个方法里边生成数据库表结构和添加一些表中要用到的初始化数据
    // SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在,会打开这个数据库,在这种情况下就不会调用onCreate()方法。如果数据库文件不存在,SQLiteOpenHelper首先会创建一个数据库文件,然后打开这个数据库,最后调用onCreate()方法。因此,onCreate()方法一般用来在新创建的数据库中建立表、视图等数据库组建。
              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");   //执行建表操作
         }
        @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //版本更新时被触发
    // 如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。
               db.execSQL("DROP TABLE IF EXISTS person");
               onCreate(db);
         }

       public static synchronized DatabaseHelper getInstance(Context context) {
        if (sSingleton == null) {
            sSingleton = new DatabaseHelper (context);
        }
        return sSingleton;
    }

}

//在另外的类使用DatabaseHelper :

  final Context context = getContext();
mDbHelper = getDatabaseHelper(context);
SQLiteDatabase db = null;
try {
    // 当程序第一次调用getWritableDatabase或getReadableDatabase()方法后,SQLiteOpenHelp会缓存已获得的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,因此程序退出时候应该关闭不再使用的SQLiteDatabase。一旦SQLiteOpenHelp缓存了SQLiteDatabase实例之后,多次调用getWritableDatabase或getReadableDatabase()方法得到的都是同一个SQLiteDatabase实例。
    db = mDbHelper.getWritableDatabase();
} catch (SQLiteDiskIOException err) {
             err.printStackTrace();
             return false;
}
 protected DatabaseHelper getDatabaseHelper(final Context context) {
        return DatabaseHelper.getInstance(context);
    }

一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行)
当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
上面onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失。

现在总结一下oncreate()和onUpdate()调用过程:
• 1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。
• 2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。
•      综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onupdate()方法先删除原先早版本数据库,并创建新数据库和其他相关组件,来升级数据库,并更新版本号。
3.  onOpen(SQLiteDatabase):
这是每次打开数据库时的回调函数,一般在程序中不是很常使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值