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();
}
}


更多相关文章

  1. 关于使用大型数据库,我需要了解什么?
  2. 一种在t-SQL中选择两个日期之间的日期的方法
  3. Asp.net中Web.config连接字符串及配置数据库sqlserver .
  4. 数据库Mysql的学习(一)
  5. 使用PDO创建长插入SQL查询的最佳方法
  6. 使用 pymysql 操作MySQL数据库
  7. Intellij Mybatis连接Mysql数据库
  8. 使用plsql访问远程数据库
  9. hsqldb数据库使用

随机推荐

  1. Centos设置开机启动Apache和Mysql[总结]
  2. MySQL添加外键错误1215
  3. 如何在执行bash查询时,获得受影响的行数?
  4. SQL查询结果区分大小写
  5. 关于淘宝的数据库系统
  6. 如何将空值传递给外键字段?
  7. python3.x的torndb使用记录(发现网上没有
  8. mysql日志文件过大导致磁盘空间不够的问
  9. 正确使用MySQL JDBC setFetchSize()方法
  10. 使用IP地址方法登录MySQL数据库Can't