Android:自定义Sqlite数据库路径
2017-06-10 17:58
826 查看
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的第一个字符为”/”就行了。
总结下就一句话,只要传入自定义路径的完整路径就好了。。。。
转载地址
相关文章推荐
- Android:自定义Sqlite数据库路径
- 30 Android 自定义文件夹名字 的路径
- Android复习练习十二(自定义ContentProvider实现其他应用操作本应用SQLite数据库)
- Android xml 自定义View需要写全路径,而系统自带的却不用?原因就在此
- android自定义camera以及uri和文件路径之间的转换
- android百度地图开发--自定义最短路径搜索图层
- android自定义Glide图片加载(以更改Glide缓存路径和使用ARGB_8888的图片格式为例)
- Android中ContentProvider(内容题供着)2访问自定义的内容提供者,共享Sqlite数据库数据
- Android 自定义Listview 如何绑定Sqlite数据库数据
- 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库
- Android编写简单的手机通讯录,只是存到数据库里面,并没有显示出来,下次更新显示到自定义适配器的通讯录(这个只是教大家SQLite数据库如何使用)
- Android自定义曲线路径动画框架
- android百度地图开发--自定义最短路径搜索图层
- Android_自定义url路径web端打开App
- Android自定义View 路径绘制、涂鸦签名的路径数据获取
- Android自定义文件路径选择器
- Android绘图:自定义View——路径(Path)、贝塞尔曲线(绘制可动的波浪线)、Bitmap
- android自定义路径的属性动画
- Android自定义Sqlite数据库位置
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)