1、熟悉了SQLite的一般用法之后,在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。例如:我们创建一个DBHelper类,它继承SQLiteOpenHelper,作为维护和管理数据库的基类;然后创建一个DBManager类,它建立在DBHelper之上,封装一系列业务方法(CRUD等)。
2、getWritableDatabase()和getReadableDatabase()的区别:
--getReadableDatabase():从源码中可以看出,该方法先判断是否已存在数据库实例并且是打开状态,如果是,则直接返回该实例,否则试图获取一个可读写模式的数据库实例,即调用getWritableDatabase()方法,如果遇到磁盘空间已满等情况获取失败的话,再以只读模式打开数据库,获取数据库实例并返回,然后为mDatabase赋值为最新打开的数据库实例。
--getWritableDatabase():先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。
--总结:getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以一般调用getWritableDatabase()来获取实例,当发生异常时,再调用getReadableDatabase(),但此时的实例为只读的。
3、Cursor的管理,Activity提供了startManagingCursor(Cursor cursor)方法,它会根据Activity的生命周期去管理当前的Cursor对象:
--startManagingCursor() 方法会根据Activity的生命周期去管理当前的Cursor对象的生命周期,就是说当Activity停止时他会自动调用Cursor的deactivate方法,禁用游标,当Activity重新回到屏幕时它会调用Cursor的requery方法再次查询,当Activity摧毁时,被管理的Cursor都会自动关闭释放.
--根据SQLite的规范,主键以"_id"为标准,在对Cursor进行包装时结果集必须包含"_id"列。