在sdCard创建数据库(打造自己的SQLiteOpenHelper)
1.在sd创建数据库
项目需求,需要在sd卡上创建数据库,看了半天的SQLiteOpenHelper代码,主要的方法就是getWritableDatabase()和getReadableDatabase(),
都是一系列的判断,然后返回SQLiteDatabase mDatabase,但是为什么就会在/data/data/com.xxxx./xxx.db呢?
认真看了代码之后,就会发现在getReadableDatabase()方法下:
String path = mContext.getDatabasePath(mName).getPath();//这里由上下文得到的路径就是在data/data/xxxxx目录
db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);
在getWritableDatabase()方法下有这样代码
if (mName == null) {
db = SQLiteDatabase.create(null);
} else {
db = mContext.openOrCreateDatabase(mName, 0, mFactory);//通过上下文创建数据库也是在data/data/下的
}
那么要在sd卡上创建数据文件,那么改变他们的路径就应该可以了:
private File getDatabasePath(String name) {
File dir=new File(Environment.getExternalStorageDirectory(), "/demo");
if(!dir.exists()) {
dir.mkdirs();
}
//name 数据库名字
return new File(dir, name);
}
那么在getReadableDatabase()和getWritableDatabase()分别作如下地方的改动
public synchronized SQLiteDatabase getReadableDatabase() {
..........
SQLiteDatabase db = null;
try {
mIsInitializing = true;
String path = getDatabasePath(mName).getPath();
// 原来的 String path = mContext.getDatabasePath(mName).getPath();
db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);
if (db.getVersion() != mNewVersion) {
throw new SQLiteException("Can't upgrade read-only database from version " +
db.getVersion() + " to " + mNewVersion + ": " + path);
}
................
} finally {
mIsInitializing = false;
if (db != null && db != mDatabase) db.close();
}
}
getWritableDatabase()
public synchronized SQLiteDatabase getWritableDatabase() {
...........................
try {
mIsInitializing = true;
if (mName == null) {
db = SQLiteDatabase.create(null);
} else {
// 原来的 db = mContext.openOrCreateDatabase(mName, 0, mFactory);
db = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(mName), mFactory);
}
..................................
} finally {
mIsInitializing = false;
if (success) {
if (mDatabase != null) {
try { mDatabase.close(); } catch (Exception e) { }
// mDatabase.unlock();
}
mDatabase = db;
} else {
// if (mDatabase != null) mDatabase.unlock();
if (db != null) db.close();
}
}
}
目前未证实为什么mDatabase.lock();在自定义SQLiteOpenHelper的时候去没有这个方法,在相应的地方需要加上读写锁,防止并发访问出现问题。
2.下载一个db数据库文件放在sd卡并且读取操作
有了上面的基础,那么很简单就可以清楚如何在sd卡上处理db文件了
db = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(mName)/.*db文件的路径*/, mFactory);
3.还可以很清楚的了解继承了SQLiteOpenHelper后如何调用onCreate(db);和 onUpgrade(db, version, mNewVersion);
int version = db.getVersion();
if (version != mNewVersion) {
db.beginTransaction();
try {
if (version == 0) {
onCreate(db);
} else {
onUpgrade(db, version, mNewVersion);
}
db.setVersion(mNewVersion);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
更多相关文章
- 关于使用大型数据库,我需要了解什么?
- 一种在t-SQL中选择两个日期之间的日期的方法
- Asp.net中Web.config连接字符串及配置数据库sqlserver .
- 数据库Mysql的学习(一)
- 使用PDO创建长插入SQL查询的最佳方法
- 使用 pymysql 操作MySQL数据库
- Intellij Mybatis连接Mysql数据库
- 使用plsql访问远程数据库
- hsqldb数据库使用