美文网首页
转:Android:使用SQLiteOpenHelper自定义d

转:Android:使用SQLiteOpenHelper自定义d

作者: Kevin_Gao | 来源:发表于2018-07-25 16:26 被阅读0次

    SQLiteOpenHelper是Android框架为我们提供的一个非常好的数据库打开、升级与关闭的工具类。但是这个工具类会自动把db文件创建到“ /data/data/com..(package name)/” 目录下,这么做可能是与Android文件系统的设计思路有关。

    不过仔细想了下突然发觉假如把数据库放到非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的第一个字符为"/"就行了。

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

    相关文章

      网友评论

          本文标题:转:Android:使用SQLiteOpenHelper自定义d

          本文链接:https://www.haomeiwen.com/subject/aqeqmftx.html