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的第一个字符为”/”就行了。
总结下就一句话,只要传入自定义路径的完整路径就好了。。。。
转载地址
阅读全文
1 0
- Android:自定义Sqlite数据库路径
- Android自定义Sqlite数据库位置
- Android 自定义Listview 如何绑定Sqlite数据库数据
- Android数据库 SQLite数据库
- android sqlite自定义DBHelper
- Android-指定路径创建 SQLite
- Android 之 SQLite 数据库
- Android 使用SQLite数据库
- android SQLite数据库应用
- Android 使用SQLite数据库
- Android☞SQLite数据库
- Android 使用SQLite数据库
- Android使用SQlite数据库
- android sqlite数据库操作
- android----SQLite数据库
- Android之SQLite数据库
- Android之SQLite数据库
- android SQLite数据库
- Base64冲突记录
- 【转载】图灵AngularJS入门教程
- SQL SERVER 多库操作数据-链接服务器
- python爬虫,抓取新浪科技的文章(beautifulsoup+mysql)
- 常规运算与叛逆
- Android:自定义Sqlite数据库路径
- Java中长度可变参数的实现 其实质是数组
- 关于对日期的去重复的总结
- linux密码破解
- Linux ZKPython 安装
- Java suspend/resume基础应用
- P1213 最优乘车
- 在ubuntu下编译opencv程序后,执行报下面到错误: error while loading shared libraries: libopencv_core.so.2.4: cannot op
- concurrentHashMap 实现