数据库位置
默认存放的位置是:
/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卡:
在做下载管理的时候,下载进度和信息的保存,都需要保存到数据库中。如果是放到默认目录下,用户清空缓存,信息则会丢失。为了避免这种情况发生,需要放到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;
这样操作之后,就添加了新的列,同时又保存了旧的数据。