β

Android Sqlite 相关汇总

拉风的道长_Android之路 82 阅读

数据库位置

默认存放的位置是:

/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没有直接添加新列的功能,需要我们自己去处理。 这种情况,表的升级方式应该如下:

  1. 重命名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;

这样操作之后,就添加了新的列,同时又保存了旧的数据。



作者:拉风的道长_Android之路
拉风的道长的博客
原文地址:Android Sqlite 相关汇总, 感谢原作者分享。