首 页最新软件下载排行文章资讯投稿发布下载专题
维维下载站
您的位置:首页软件教程应用软件 → Android中用SQLiteOpenHelper管理SD卡中的数据库方法

Android中用SQLiteOpenHelper管理SD卡中的数据库方法

来源:本站整理 发布时间:2013-9-30 14:51:40 人气:

运用Android中自带的SQLiteOpenHelper能够完结数据库的创立与办理,但有两点约束:

(1)数据库创立在内存卡中,巨细受限,创立方位坐落/data/data/运用程序名/databases中(可运用Eclispe的DDMS检查)。

(2)若是无法获取Root权限,则无法直接检查创立的数据库。

鉴于上述约束及实际需求,计划运用SQLiteOpenHelper办理SD卡上的数据库,经过研讨SQLiteOpenHelper的源码,发现其创立或翻开数据库的代码坐落getWritableDatabase()函数中(getReadableDatabase自身也是调用了getWritableDatabase):

if (mName == null) {
     db = SQLiteDatabase.create(null);
     } 
else {
     db = mContext.openOrCreateDatabase(mName, 0, mFactory);
     }

剖析上述代码发现,当数据库姓名为非空时,创立数据库或翻开由mContext完结,这个mContext由SQLiteOpenHelper的结构函数传入:SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)。那么咱们关于传入的context,重载其openOrCreateDatabase函数,使其将数据库创立到SD卡中就可完结咱们的方针了~。

对应的SQLiteOpenHelper完成类SdCardDBHelper

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * 数据库办理和保护类
**/
public class SdCardDBHelper extends SQLiteOpenHelper{
    
    public static final String TAG = "SdCardDBHelper";
    /**
     * 数据库称号
    **/
    public static String DATABASE_NAME = "sddb.db";
    
    /**
     * 数据库版别
    **/
    public static int DATABASE_VERSION = 1;
        
    /**
     * 结构函数
     * 
     * @param    context 上下文环境
    **/
    public SdCardDBHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }    
     
    /**
     * 创立数据库时触发,创立离线存储所需求的数据库表
     *
     * @param    db
    **/
    @Override
    public void onCreate(SQLiteDatabase db) {
         Log.e(TAG, "开端创立数据库表");
        try{
            //创立用户表(user)
             db.execSQL("create table if not exists user" +
                     "(_id integer primary key autoincrement,name varchar(20),password varchar(20),role varchar(10),updateTime varchar(20))");
            Log.e(TAG, "创立离线所需数据库表成功");
        }
        catch(SQLException se){
            se.printStackTrace();
            Log.e(TAG, "创立离线所需数据库表失利");
        }        
    }
    
    /** 更新数据库时触发,
     *
     * @param    db
     * @param    oldVersion
     * @param    newVersion
    **/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //db.execSQL("ALTER TABLE person ADD COLUMN other STRING");  
     }
}

重载的openOrCreateDatabase在sd卡上创立数据库的Context

import java.io.File;
import java.io.IOException;

import android.content.Context;
import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

/**
 * 用于撑持对存储在SD卡上的数据库的拜访
**/
public class DatabaseContext extends ContextWrapper {        
           
        /**
         * 结构函数
         * @param    base 上下文环境
         */
        public DatabaseContext(Context base){
            super(base);
        }
     
        /**
         * 取得数据库途径,若是不存在,则创立目标目标
         * @param    name
         * @param    mode
         * @param    factory
         */
        @Override
        public File getDatabasePath(String name) {
            //判别是不是存在sd卡
            boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
            if(!sdExist){//若是不存在,
                Log.e("SD卡办理:", "SD卡不存在,请加载SD卡");
                return null;
            } 
            else{//若是存在
                //获取sd卡途径
                String dbDir=android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
                dbDir += "/database";//数据库地点目录
                String dbPath = dbDir+"/"+name;//数据库途径
                //判别目录是不是存在,不存在则创立该目录
                File dirFile = new File(dbDir);
                if(!dirFile.exists())
                    dirFile.mkdirs();
                
                //数据库文件是不是创立成功
                boolean isFileCreateSuccess = false; 
                //判别文件是不是存在,不存在则创立该文件
                File dbFile = new File(dbPath);
                if(!dbFile.exists()){
                    try {                    
                        isFileCreateSuccess = dbFile.createNewFile();//创立文件
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                else     
                    isFileCreateSuccess = true;
                
                //回来数据库文件目标
                if(isFileCreateSuccess)
                    return dbFile;
                else 
                    return null;
            }
        }
     
        /**
         * 重载这个办法,是用来翻开SD卡上的数据库的,android 2.3及以下会调用这个办法。
         * 
         * @param    name
         * @param    mode
         * @param    factory
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, 
                SQLiteDatabase.CursorFactory factory) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
            return result;
        }
        
        /**
         * Android 4.0会调用此办法获取数据库。
         * 
         * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int, 
         *              android.database.sqlite.SQLiteDatabase.CursorFactory,
         *              android.database.DatabaseErrorHandler)
         * @param    name
         * @param    mode
         * @param    factory
         * @param     errorHandler
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
                DatabaseErrorHandler errorHandler) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
            return result;
        }
    }

调用程序:

DatabaseContext dbContext = new DatabaseContext(this);
SdCardDBHelper dbHelper = new SdCardDBHelper(dbContext);

这儿特别值得注意的是,不一样版别的android API会调用不一样的openOrCreateDatabase函数。

当然也可直接运用SQLiteDatabase创立SD卡上的数据库,或许直接修正SQLiteOpenHelper的源码从头编译,不过前者没有对数据库进行一些查验容错处置,也不及SQLiteOpenHelper对数据库操作便利。后者工作量较大,不主张选用。

最终注意记住参加对SD卡的读写权限:

 

SQLite桌面检查东西:sqlite administrator、sqlite man或许firefox插件sqlite manager等。

相关下载
栏目导航
本类热门阅览