public class MyDB extends SQLiteOpenHelper {
// 数据库的缺省路径
private static String DB_PATH ;
private static final String DB_NAME = "aa.db";
private static final int DB_VERSION = 2;
private SQLiteDatabase m_database;
private final Context m_context;
/**
*
* Constructor
*
* 保存传进来的context参数以用来访问应用的asset和raw文件。
*
* @param context
*/
public MyDB(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.m_context = context;
DB_PATH ="/data/data/"+context.getPackageName()+"/databases/";
}
public static MyDB openDatabaseReadOnly(Context context) {
MyDB db = new MyDB(context);
try {
db.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
db.openDataBase(SQLiteDatabase.OPEN_READONLY);
return db;
}
public static MyDB openDatabaseReadWrite(Context context) {
MyDB db = new MyDB(context);
try {
db.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
db.openDataBase(SQLiteDatabase.OPEN_READWRITE);
return db;
}
/**
*
* 创建一个空数据库,用来存储你已有的数据库。
*/
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// 如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时
// 传进去的是可写的数据库。
SQLiteDatabase db = this.getWritableDatabase();
if (db != null) {
db.close();
}
}
dbExist = checkDataBase();
if (!dbExist) {
try {
// 调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制我们已有的数据库。
SQLiteDatabase db = this.getReadableDatabase();
if (db != null) {
db.close();
}
copyDataBase();
} catch (IOException e) {
Log.e("DB", e.getMessage());
throw new Error("Error copyingdatabase");
}
}
}
/**
*
* 检查数据库是否已存在,以避免重复复制。
*
* @return true if it exists, false if itdoesn't
*/
private static boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String path = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY);
}
catch (SQLiteException e) {
e.printStackTrace();
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
*
* 把存在asset文件中的数据库复制的刚创建的空数据库中。
*
* */
private void copyDataBase() throws IOException {
// 刚创建的空数据库的路径
String outFileName = DB_PATH + DB_NAME;
// 打开空数据库
OutputStream output = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
// AssetManager assetMgr = m_context.getAssets();
// 打开分解的asset文件
// InputStream input = assetMgr.open(fn);
InputStream input =m_context.getResources().openRawResource(R.raw.area);
int length;
while ((length = input.read(buffer)) !=-1) {
output.write(buffer, 0, length);
}
input.close();
output.flush();
output.close();
}
/**
*
* 打开数据库。
*
* */
private void openDataBase(int flags) throws SQLException { String myPath = DB_PATH + DB_NAME;
m_database = SQLiteDatabase.openDatabase(myPath, null, flags);
}
/**
*
* 关闭数据库。
*
* */
@Override
public synchronized void close() {
if (m_database != null)
m_database.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {}
/**
*
* 在数据库版本提高时,删除原有数据库。
*
* */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
m_context.deleteDatabase(DB_NAME);
}
}
}

String path = DB_PATH + DB_NAME;
   checkDB = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY);

REFERENCES:http://www.apkbus.com/home.php?mod=space&uid=151485&do=blog&quickforward=1&id=53675

读取本地已有的.db数据库的更多相关文章

  1. AndroidStudio 中查看获取MD5和SHA1值以及如何查看手机应用信息以及读取*.db数据库里面数据

    查看获取MD5和SHA1值具体操作方式链接 查看获取MD5和SHA1值实际操作命令CMD语句: C:\Users\Administrator>cd .android C:\Users\Admin ...

  2. python 读取本地文件批量插入mysql

    Uin_phone.txt 本地文件内容 有1000条,这里只是展示前几条,供参考 133584752 133584759 133584764 133584773 133584775 13358477 ...

  3. APICloud框架—db数据库模块

    db数据库模块 db 模块封装了手机常用数据库 sqlite 的增删改查语句,可实现数据的本地存储,极大的简化了数据持久化问题,本模块已支持同步接口. 官方文档地址 打开/新建一个数据库 functi ...

  4. jmeter读取执行case插入DB生成报表和备份记录

    前言:由于通过jmeter写的接口自动化木有数据导入和统计分析功能,因此做了2次开发,目的是读取每条case获取接口名称和用例名称,通过获取的case执行结果进行计算,得到详细接口的用例通过率存入DB ...

  5. Maria DB数据库基础知识

    Maria DB连接 与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件. Maria DB命令行登录数据库服务: mysql -u root -p -- 换行输入密码 上面给 ...

  6. C#.NET ORM FreeSql 读取使用 US7ASCII 的 Oracle 数据库中文显示乱码问题

    前言 关于 Oracle US7ASCII 中文乱码的问题,Ado.Net 和 Odbc 无法解决.包括最新的.Net Core..NET6..NET7 都无法解决这个问题. FreeSql 对 Or ...

  7. 《Entity Framework 6 Recipes》翻译系列 (4) -----第二章 实体数据建模基础之从已存在的数据库创建模型

    不知道对EF感兴趣的并不多,还是我翻译有问题(如果是,恳请你指正),通过前几篇的反馈,阅读这个系列的人不多.不要这事到最后成了吃不讨好的事就麻烦了,废话就到这里,直奔主题. 2-2 从已存在的数据库创 ...

  8. 读取本地外网IP地址

    读取本地外网IP地址. 根据启动并运行的网卡名称,找到本机实际的IP地址(已知当前运行的无线网卡名包含某一个字符) import java.net.InterfaceAddress; import j ...

  9. window.open()读取本地图片简单使用总结

    最近做了一个项目,需要读取本地图片出来,问了一些人,感觉在数据库中存取路径比较合适,故做此方法. 后台查询出来的路径

随机推荐

  1. Android ListView之选中(撤销选中)Item

    在ContactListActivity中,点击未选中的item将其选中,再点击已选中的item撤销其选中 public void onItemClick(AdapterView<?> p ...

  2. 树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM

    我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi.        PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平 ...

  3. 进阶之路(基础篇) - 022 Arduino Leonardo 中文介绍(摘抄)

    本文摘抄:http://www.arduino.cn/thread-1205-1-1.html 概述Arduino Leonardo是基于ATmega32u4一个微控制器板.它有20个数字输入/输出引 ...

  4. 深入学习 Git 工作流

    原文  https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md   个人在学习git工作流的过程中,从原有的 SVN ...

  5. Java and C# Comparison

    原文:http://www.harding.edu/fmccown/java_csharp_comparison.html Java Program Structure C# package hell ...

  6. block(九)Block 和 Delegate 的使用比较

    Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段 Block(代码块) 优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的实现地方在同 ...

  7. 【Linux】字符转换命令tr

    tr (traslate的缩写)可以用来删除一段信息当中的文字,或者是进行文字信息的替换! [root@www ~]# tr [-ds] SET1 ... 选项与参数: -d :删除信息当中的 SET ...

  8. jQuery Chosen 使用

    jQuery Chosen 使用   1.  jQuery Chosen 选择框下拉值重置: 1 2 3 4 //重置 $("#easySelBrands").val(" ...

  9. mysql慢查询日志相关参数

    -- mysql慢查询日志相关参数 -- 慢查询日志时间 show variables like "long_query_time"; -- 将时间设置为2s ; -- 是否开启慢 ...

  10. Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER 解决方案

    主要是由于调试的环境中已有一个同名的Provider存在. 解决方法是修改AndroidManifest.xml中的 <provider android:name=".apps.App ...