/data/data/【package_name】/databases
通常的写法,都是放在以上目录下的,比如:
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class SysLocationDbHelper extends SQLiteOpenHelper { private static final int DB_VERSION = 5; private static final String DB_NAME = "testLocalDb.db"; public SysLocationDbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { /** * 创建数据库会走的方法 * <p> * 1、在第一次打开数据库的时候才会走 * <p> * 2、在清除数据之后再次运行-->打开数据库,这个方法会走 * <p> * 3、没有清除数据,不会走这个方法 * <p> * 4、数据库升级的时候这个方法不会走 */ } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 升级数据库版本会走的方法 * <p> * 1、第一次创建数据库的时候,这个方法不会走 * <p> * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走 * <p> * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用 */ } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 执行数据库的降级操作 * <p> * 1、只有新版本比旧版本低的时候才会执行 * <p> * 2、如果不执行降级操作,会抛出异常 */ } }
调用方式:
SysLocationDbHelper helper = new SysLocationDbHelper(this); SQLiteDatabase db = helper.getWritableDatabase(); //....
这样,就会在包名对应目录下出现数据库。
在做下载管理的时候,下载进度和信息的保存,都需要保存到数据库中。如果是放到默认目录下,用户清空缓存,信息则会丢失。为了避免这种情况发生,需要放到SD卡中:
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class SdcardLocationDbHelper extends SQLiteOpenHelper { private static final int DB_VERSION = 5; //这里设置路径 private static final String DB_NAME = android.os.Environment .getExternalStorageDirectory().getAbsolutePath() + "/Sdcard/testSdcardDb.db"; public SdcardLocationDbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { /** * 创建数据库会走的方法 * <p> * 1、在第一次打开数据库的时候才会走 * <p> * 2、在清除数据之后再次运行-->打开数据库,这个方法会走 * <p> * 3、没有清除数据,不会走这个方法 * <p> * 4、数据库升级的时候这个方法不会走 */ } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 升级数据库版本会走的方法 * <p> * 1、第一次创建数据库的时候,这个方法不会走 * <p> * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走 * <p> * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用 */ } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 执行数据库的降级操作 * <p> * 1、只有新版本比旧版本低的时候才会执行 * <p> * 2、如果不执行降级操作,会抛出异常 */ } }
调用方式:
SdcardLocationDbHelper helper = new SdcardLocationDbHelper(this); SQLiteDatabase db = helper.getWritableDatabase();
这样,数据库文件就会出现在SD卡中了。
路径设置不同:
每次升级数据库时,都会走到
onUpgrade
方法。升级代码在这里写的时候要特别注意:由于无法控制用户的升级,数据库版本可能存在跨版本问题。
比如:数据库有三个版本 : 1,2,3.那么在实现onUpgrade方法的时候应该如下写
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 升级数据库版本会走的方法 */ int updateOldVersion = oldVersion; if (1 == updateOldVersion) { // 处理1的升级 updateOldVersion = 2; } if (2 == updateOldVersion) { // 处理2的升级 updateOldVersion = 3; } if(3 == updateOldVersion) { //添加3的升级 } }
当出现第4个版本的时候,同样:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /** * 升级数据库版本会走的方法 */ int updateOldVersion = oldVersion; if (1 == updateOldVersion) { // 处理1的升级 updateOldVersion = 2; } if (2 == updateOldVersion) { // 处理2的升级 updateOldVersion = 3; } if(3 == updateOldVersion) { //原来添加的3的升级 updateOldVersion = 4; } if(4 == updateOldVersion) { //添加4的升级 } }
对于数据库中某一张表TableA,v1的时候有2个字段,v2的时候添加了一个字段,有三个字段。SQL没有直接添加新列的功能,需要我们自己去处理。 这种情况,表的升级方式应该如下:
重命名TableA,改为备份表,比如改为TableA_Bak
ALERT TABLE TableA RENAME TO TableA_Bak
2. 重新创建新的TableA,这里应该是3个字段的表了。
3. 拷贝备份表里的数据到新的TableA
INSERT INTO TableA (Col1, Col2) SELECT (Col1, Col2) FROM TableA_Bak;
这样操作之后,就添加了新的列,同时又保存了旧的数据。