您的位置:首页 > 移动开发 > Android开发

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

2016-02-13 21:09 316 查看
在做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:

[java] view
plain copy

 print?





<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中获得数据库中的数据:

[java] view
plain copy

 print?





<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视图也贴出来吧,很简单,一看就懂了。



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



可以看到,我们得到了数据库中的数据了,接下来大家可以把bin目录下的apk文件放入到真机中测试,依然会得到数据库中的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: