最近在写全景图片查看器的项目,用到了SQLite数据库。由于数据库中需要存放图片缩略图,导致数据库比较庞大,如果直接放在内存中,可能会出现运行缓慢占用内存过大的问题。因此想把数据库创建到外部存储。参考了其他关于解决此问题的博客,
此博客写的比较详细,感谢原作者。
根据作者的思路,本人查看了一下SQLiteOpenHelper的源码,发现在该类构造函数执行的操作就是创建一个可用的数据库文件,而参数列表中的第二个参数(源码中参数名是name),一直以来对该参数的理解就是数据库的名称。
源码
if (DEBUG_STRICT_READONLY && !writable) {
final String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory,
SQLiteDatabase.OPEN_READONLY, mErrorHandler);
}
此段代码比较关键,从这里可以看出,mName(值等于参数列表的name)实际上指的是要创建的数据库的完整路径,所以想把数据库创建在SD卡中,只需要将name值设置为一个你想要的完整路径,再传进OpenHelper的构造函数就可以了.
附上一个小小的demo
public class MyDbhelper extends SQLiteOpenHelper {
static String db_path = Environment.getExternalStorageDirectory()
+ "/mydb/db_test";
public MyDbhelper(Context context) {
super(context, db_path, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table dbtest(integer id ,varchar name)";
db.execSQL(sql);
Log.e("MyDbhelper", "test: onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class Dbtest {
private MyDbhelper myDbhelper;
private SQLiteDatabase db;
public Dbtest(Context context){
File file = new File(Environment.getExternalStorageDirectory()+"/mydb");
if(!file.exists()){
file.mkdir();
}
myDbhelper = new MyDbhelper(context);
db = myDbhelper.getWritableDatabase();
Log.e("test", "db == null"+(db==null));
}
}
在mainActivity中创建Dbtest对象,即可看到我们指定的数据库目录以及数据库文件被创建出来了。导出db文件查看,数据库和数据表确实已经被创建了。