Android:自定义Sqlite数据库路径

来源:互联网 发布:新浪经济数据 编辑:程序博客网 时间:2024/06/15 10:51

Android:自定义Sqlite数据库路径

默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目录下的,虽然不知道为什么要放到这个目录,不过仔细想了下突然发觉假如把数据库放到非data目录下的话,就可以不借助contentprovider之类的方式实现跨应用访问数据库了,虽然安全性会降低,但在部分场景下还是会有所作用的。

阅读下了SqliteOpenHelper的源码,和数据库路径相关部分如下。

public SQLiteDatabase getWritableDatabase() {        synchronized (this) {            return getDatabaseLocked(true);        }    }    public SQLiteDatabase getReadableDatabase() {        synchronized (this) {            return getDatabaseLocked(false);        }    }private SQLiteDatabase getDatabaseLocked(boolean writable) {        if (mDatabase != null) {            if (!mDatabase.isOpen()) {                // Darn!  The user closed the database by calling mDatabase.close().                mDatabase = null;            } else if (!writable || !mDatabase.isReadOnly()) {                // The database is already open for business.                return mDatabase;            }        }        if (mIsInitializing) {            throw new IllegalStateException("getDatabase called recursively");        }        SQLiteDatabase db = mDatabase;        try {            mIsInitializing = true;            if (db != null) {                if (writable && db.isReadOnly()) {                    db.reopenReadWrite();                }            } else if (mName == null) {                db = SQLiteDatabase.create(null);            } else {                try {                    if (DEBUG_STRICT_READONLY && !writable) {                       String path = mContext.getDatabasePath(mName).getPath()                        db = SQLiteDatabase.openDatabase(path, mFactory,                                SQLiteDatabase.OPEN_READONLY, mErrorHandler);                    } else {                        db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?                                Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,                                mFactory, mErrorHandler);                    }                } catch (SQLiteException ex) {                    if (writable) {                        throw ex;                    }                    Log.e(TAG, "Couldn't open " + mName                            + " for writing (will try read-only):", ex);                    final String path = mContext.getDatabasePath(mName).getPath();                    db = SQLiteDatabase.openDatabase(path, mFactory,                            SQLiteDatabase.OPEN_READONLY, mErrorHandler);                }            }            ........

  其实是调用了mContext的getDataBasePath方法,这个方法是在ContextImpl中实现的,再看下源码

@Override    public File getDatabasePath(String name) {        return validateFilePath(name, false);    }private File validateFilePath(String name, boolean createDirectory) {        File dir;        File f;        if (name.charAt(0) == File.separatorChar) {            String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));            dir = new File(dirPath);            name = name.substring(name.lastIndexOf(File.separatorChar));            f = new File(dir, name);        } else {            dir = getDatabasesDir();            f = makeFilename(dir, name);        }        if (createDirectory && !dir.isDirectory() && dir.mkdir()) {            FileUtils.setPermissions(dir.getPath(),                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,                -1, -1);        }        return f;    }

好吧,原来这么简单,原来Android本身已经实现了自定义路径的方法了,只要传入的path的第一个字符为”/”就行了。

总结下就一句话,只要传入自定义路径的完整路径就好了。。。。

转载地址

原创粉丝点击