在sdCard创建数据库(打造自己的SQLiteOpenHelper)
来源:互联网 发布:电子屏图文信息软件 编辑:程序博客网 时间:2024/06/06 05:40
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();
}
}
- 在sdCard创建数据库(打造自己的SQLiteOpenHelper)
- SQLiteDatabase 在sdcard创建数据库的步骤
- 在手机的sdcard上创建数据库研究
- SQLiteOpenHelper(创建或打开数据库)
- 用SQLiteOpenHelper创建数据库
- android 在SdCard上创建数据库
- 2014-10-27Android学习------SQLite数据库操作(二)-----数据库的创建--SQLiteHelper extends SQLiteOpenHelper
- 打造自己的ip 数据库
- 继承SQLiteOpenHelper类实现自己的SQLite数据库操作
- 在任意路径创建AVD的sdcard
- SQLiteOpenHelper中实现创建数据库与版本变化的源代码
- SQLiteOpenHelper数据库的创建or升级or增删改查
- 关于 SQLiteOpenHelper 的自创建数据库目录文件
- Android SQLiteOpenHelper Sqlite数据库的创建与打开
- 创建基本blog --- yii打造自己的blog (二)
- android SQLiteOpenHelper(数据库)
- 建立数据库 --- yii打造自己的blog (四)
- SQLiteOpenHelper创建数据库,使用Junit进行测试
- scanf
- 中科院报告:360产品存在三大隐私安全问题
- BloomFilter——大规模数据处理利器
- 常用的Shell命令汇总
- 国外一网站的CSS代码重定义,留着备用
- 在sdCard创建数据库(打造自己的SQLiteOpenHelper)
- 白话经典算法系列之六 快速排序 快速搞定
- STL
- 虚拟机安装64位Orace_Linux
- 白话经典算法系列之七 堆与堆排序
- Android发送邮件附带文件
- C/C++中 关于对 引用变量 赋值的一些规则
- ffmpeg decode raw h264
- static 全局变量和普通全局变量