Android开发系列(十七):读取assets文件夹下的数据库文件

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

(PS:这篇博客攻克了我前面博客中写的一个小游戏的一个问题。另外也能够读取Raw文件夹下的数据库文件)

这就造成了一个问题。这个问题事实上非常好解决,解决方法例如以下:

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

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

首先。我们建立一个datab的Android Project命名为datab,我们把project的文件夹视图贴出来:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

我们首先要创建一个数据库,能够在DatabActivity.java中用sql语句创建,然后插入几条数据。然后把创建好而且插入数据的数据库放入assets目录下边。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

能够看到。在test.db中我们插入了三条数据。

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

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

<span style="font-size:18px;">package com.datab.cn;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

/**
 * 这个类就是实现从assets文件夹读取数据库文件然后写入SDcard中,假设在SDcard中存在。就打开数据库,不存在就从assets文件夹下复制过去
 * @author Big_Adamapple
 *
 */
public class SQLdm {  

    //数据库存储路径
    String filePath = "data/data/com.datab.cn/test.db";
    //数据库存放的文件夹 data/data/com.main.jh 以下
    String pathStr = "data/data/com.datab.cn";  

    SQLiteDatabase database;
    public  SQLiteDatabase openDatabase(Context context){
        System.out.println("filePath:"+filePath);
        File jhPath=new File(filePath);
            //查看数据库文件是否存在
            if(jhPath.exists()){
            	Log.i("test", "存在数据库");
                //存在则直接返回打开的数据库
                return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
            }else{
                //不存在先创建文件夹
                File path=new File(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=new FileOutputStream(jhPath);
                    Log.i("test", "fos="+fos);
                    Log.i("test", "jhPath="+jhPath);
                    //创建byte数组  用于1KB写一次
                    byte[] buffer=new byte[1024];
                    int count = 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();
                    return null;
                }
                //假设没有这个数据库  我们已经把他写到SD卡上了。然后在运行一次这种方法 就能够返回数据库了
                return openDatabase(context);
            }
    }
}
</span>

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

<span style="font-size:18px;">package com.datab.cn;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class DatabActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //打开数据库输出流
        SQLdm s = new SQLdm();
        SQLiteDatabase db =s.openDatabase(getApplicationContext()); 

        TextView textv = (TextView) findViewById(R.id.textv);
        //查询数据库中testid=1的数据
        Cursor cursor = db.rawQuery("select * from testbiao where testid=?", new String[]{"1"});
        String name = null;
        if(cursor.moveToFirst()){
            name = cursor.getString(cursor.getColumnIndex("name"));
        }
        //这是一个TextView,把得到的数据库中的name显示出来.
        textv.setText(name);
        cursor.close();
    }
}</span>

我们的main.xml视图也贴出来吧,非常easy。一看就懂了。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

能够看到,我们得到了数据库中的数据了,接下来大家能够把bin文件夹下的apk文件放入到真机中測试,依旧会得到数据库中的数据

时间: 2024-12-25 16:00:27

Android开发系列(十七):读取assets文件夹下的数据库文件的相关文章

java读取某个文件夹下的所有文件

import java.io.FileNotFoundException;import java.io.IOException;import java.io.File; public class ReadFile {        public ReadFile() {        }        /**         * 读取某个文件夹下的所有文件         */        public static boolean readfile(String filepath) thro

cocos2d-x 如何读取遍历文件夹下的所有文件 (简单明了/童少无欺)

比如我要遍历Resources/music下面所有的文件 导入头文件 #include <sys/stat.h> #include "dirent.h" #include "unistd.h" 实现代码 std::string filePath = FileUtils::getInstance()->fullPathForFilename("music"); CCLOG("%s",filePath.c_str

php 读取网页源码 , 导出成txt文件, 读取xls,读取文件夹下的所有文件的文件名

<?php // 读取网页源码$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_HEADER, 1);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点.$contents = curl_exec($curl); //导出成

读取某个文件夹下的所有文件

mport java.io.FileNotFoundException; import java.io.IOException; import java.io.File; public class ReadFile { public ReadFile() { } /** * 读取某个文件夹下的所有文件 */ public static boolean readfile(String filepath) throws FileNotFoundException, IOException { try

读取文件夹下所有子文件夹中的excel文件,并根据分类合并

解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独保存汇总文件,或者只保存成一个汇总文件. 场景描述:抓取了各个APP的使用数据,分散地保存在各个文件夹中.文件格式如下: 第一级分类:文件夹名 第二级分类:文件夹下xlsx文件名 第三级分类:每个xlsx文件中每行(具体的每条数据),但其中并没有该APP属于的二级分类和一级分类,需要为每条数据添加二

如何遍历文件夹下上亿文件而不溢出(转载)

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出.那我们该怎么办? 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html 新浪微博:intsmaze刘洋洋哥 微信:intsmaze 说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历.他说他当时比较

如何遍历文件夹下上亿文件而不栈溢出

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出.那我们该怎么办? 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html 新浪微博:intsmaze刘洋洋哥 微信:intsmaze 说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历.他说他当时比较

Nodejs下如何判断文件夹的存在以及删除文件夹下所有的文件

代码如下: 1 var folder_exists = fs.existsSync('./cache'); 2 3 if(folder_exists == true) 4 { 5 var dirList = fs.readdirSync('./cache'); 6 7 dirList.forEach(function(fileName) 8 { 9 fs.unlinkSync('./cache/' + fileName); 10 }); 11 } 第一行代码判断当前文件夹下有无cache目录,如

linux查找文件夹下的全部文件里是否含有某个字符串

查找文件夹下的全部文件里是否含有某个字符串 find .|xargs grep -ri "IBM" 查找文件夹下的全部文件里是否含有某个字符串,而且仅仅打印出文件名称 find .|xargs grep -ri "IBM" -l 1.正則表達式 (1)正則表達式一般用来描写叙述文本模式的特殊使用方法,由普通字符(比如字符a-z)以及特殊字符(称为元字符.如/.*.?等)组成. (2)基本元字符集及其含义 ^ :仅仅匹配行首. 如^a 匹配以a开头的行abc,a2e,