在做Android应用的时候,不可避免要用到数据库。但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的。

(PS:这篇博客解决了我前面博客中写的一个小游戏的一个问题,另外也可以读取Raw目录下的数据库文件)

这就造成了一个问题,这个问题其实很好解决,解决方法如下:

我们首先把有数据的数据库文件放在assets资源目录下边,然后在apk应用启动的时候,把assets目录下的数据库文件的数据写入到真机的内存中去。

下边开始我们的代码编写:

首先,我们建立一个datab的Android Project命名为datab,我们把工程的目录视图贴出来:

我们首先要创建一个数据库,可以在DatabActivity.java中用sql语句创建,然后插入几条数据。然后把创建好并且插入数据的数据库放入assets文件夹下边。

我们看下我放入的test.db数据库的结构:

可以看到,在test.db中我们插入了三条数据。

接下来,我们就是要在应用启动的时候读取assets目录下的数据库,然后把test.db写入SDcard的data/data/com.datab.cn路径下边。

我们首先新建一个类:SQLdm.java:

packagecom.datab.cn;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.io.InputStream;

importandroid.content.Context;

importandroid.content.res.AssetManager;

importandroid.database.sqlite.SQLiteDatabase;

importandroid.util.Log;

/**

* 这个类就是实现从assets目录读取数据库文件然后写入SDcard中,如果在SDcard中存在,就打开数据库,不存在就从assets目录下复制过去

* @author Big_Adamapple

*

*/

publicclassSQLdm {

//数据库存储路径

String filePath = "data/data/com.datab.cn/test.db";

//数据库存放的文件夹 data/data/com.main.jh 下面

String pathStr = "data/data/com.datab.cn";

SQLiteDatabase database;

publicSQLiteDatabase openDatabase(Context context){

System.out.println("filePath:"+filePath);

File jhPath=newFile(filePath);

//查看数据库文件是否存在

if(jhPath.exists()){

Log.i("test","存在数据库");

//存在则直接返回打开的数据库

returnSQLiteDatabase.openOrCreateDatabase(jhPath,null);

}else{

//不存在先创建文件夹

File path=newFile(pathStr);

Log.i("test","pathStr="+path);

if(path.mkdir()){

Log.i("test","创建成功");

}else{

Log.i("test","创建失败");

};

try{

//得到资源

AssetManager am= context.getAssets();

//得到数据库的输入流

InputStream is=am.open("test.db");

Log.i("test", is+"");

//用输出流写到SDcard上面

FileOutputStream fos=newFileOutputStream(jhPath);

Log.i("test","fos="+fos);

Log.i("test","jhPath="+jhPath);

//创建byte数组  用于1KB写一次

byte[] buffer=newbyte[1024];

intcount =0;

while((count = is.read(buffer))>0){

Log.i("test","得到");

fos.write(buffer,0,count);

}

//最后关闭就可以了

fos.flush();

fos.close();

is.close();

} catch(IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

returnnull;

}

//如果没有这个数据库  我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了

returnopenDatabase(context);

}

}

}

然后,我们在DatabActivity.java中获得数据库中的数据:

packagecom.datab.cn;

importandroid.app.Activity;

importandroid.database.Cursor;

importandroid.database.sqlite.SQLiteDatabase;

importandroid.os.Bundle;

importandroid.widget.TextView;

publicclassDatabActivityextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//打开数据库输出流

SQLdm s = newSQLdm();

SQLiteDatabase db =s.openDatabase(getApplicationContext());

TextView textv = (TextView) findViewById(R.id.textv);

//查询数据库中testid=1的数据

Cursor cursor = db.rawQuery("select * from testbiao where testid=?",newString[]{"1"});

String name = null;

if(cursor.moveToFirst()){

name = cursor.getString(cursor.getColumnIndex("name"));

}

//这是一个TextView,把得到的数据库中的name显示出来.

textv.setText(name);

cursor.close();

}

}

我们的main.xml视图也贴出来吧,很简单,一看就懂了。

然后,我们在虚拟机上看看我们的界面是什么样的:

可以看到,我们得到了数据库中的数据了,接下来大家可以把bin目录下的apk文件放入到真机中测试,依然会得到数据库中的数据

android读取mysql数据库文件_Android开发系列(十七):读取assets目录下的数据库文件...相关推荐

  1. Android之解决PC浏览器访问手机服务端取assets目录下的文件页面显示不出来问题

    1 问题 我在手机里面写了Java socket服务,然后把前端的图片和css和js的文件放到了安卓项目的 assets目录,然后浏览器访问服务,我会把 assets目录下的文件读出来,然后用Data ...

  2. (转)Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)

    原文:http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder 1.隐藏文件夹 以.开头的文件夹会被Un ...

  3. asset文件夹路径 unity_Unity Assets目录下的特殊文件夹名称

    1.隐藏文件夹 以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中. 2.Standard Assets 在这个文件夹中的脚本最先被编 ...

  4. java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化

    列举目录中的所有文件 首先给出代码: Files.list(Paths.get(".")).forEach(System.out::println); Files.list方法得到 ...

  5. JAVA file列出所有文件_用Java代码列出一个目录下所有的文件

    1.File类 File类在java.io.File包中,所以要导入这个包. File类中用到的方法: boolean isDirectory()       测试此抽象路径名表示的文件是否是个目录 ...

  6. webview加载assets目录下html静态文件

    1. 路径是"file:///android_asset/w**.html",而不是"file:///assets/w**dex.html"package co ...

  7. vue3vite工程里面引入assets目录下的图片文件(一种方法)

    <template><div><p>轮播图</p><van-swipe class="my-swipe" :autoplay= ...

  8. 安卓读取mysql数据库文件路径_Android开发实现读取assets目录下db文件的方法示例...

    本文实例讲述了Android开发实现读取assets目录下db文件的方法.分享给大家供大家参考,具体如下: 最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api ...

  9. Android读取assets目录下文件数据内容

    Android读取assets目录下文件数据内容 Android的体系架构设计中,assets目录下的数据内容(图片.文件等等)将不会被Android系统压缩.二次处理等,assets目录下的文件 ...

最新文章

  1. 我在旷视研究院做检测 | 技术头条
  2. 用Map构造选择题题库(洛谷P5601题题解,Java语言描述)
  3. vueCli3中使用代理,点击页面的刷新按钮时报错
  4. 输出斐波那契数列的第n项
  5. Web.config中注册用户控件和自定义控件
  6. 网卡驱动程序问题---电脑自己没操作,突然连不上网
  7. Debian Ubuntu/Centos7设置某些软件不自动更新
  8. 完全干净卸载 iTunes 步骤
  9. lenovo计算机无法启动,联想台式电脑不能启动开机
  10. Python编程定义函数参数的小tips
  11. 计算机在化学中论文3000字,化学论文范文3000字_化学论文发表
  12. 留德APS审核 - 计算机科学与技术 - 2020北京英语审核 (一审通过)
  13. 多少秒算长镜头_什么是长镜头画面(电影里的长镜头有哪些分类)
  14. 星淘惠告诉你跨境平台那么多,凭什么要选亚马逊?
  15. Python numpy函数:shape用法(简单样本及样本对应变量场景)
  16. 语音模块LD3320模块的二次开发,并与树莓派进行串口通信
  17. 学python人工智能电脑要什么配置_学Python需要什么配置的电脑?
  18. Effective Modern C++[实践]->优先使用nullptr,而非0或NULL
  19. 网络时间协议(NTP)--网络大典
  20. 所有帖子的 分类 总结

热门文章

  1. UVA10494 If We Were a Child Again【大数除法】
  2. Bailian2738 实数加法【数学】
  3. Bailian2818 密码【密码+置换】
  4. matlab 排列组合
  5. 证明的思路 —— 数形结合
  6. C/C++ —— signed 与 unsigned 有符号和无符号数及其移位
  7. 跨编程语言平台的通信
  8. Tricks(三十二)—— 二维数组转换为一维数组
  9. java gui变量_关于java:静态/类变量和GUI
  10. 完整的python项目实例-《Python爬虫开发与项目实战》pdf完整版