zoukankan      html  css  js  c++  java
  • Android开发系列(十七):读取assets文件夹下的数据库文件

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

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

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

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



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

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


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

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


    能够看到。在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。一看就懂了。

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




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

  • 相关阅读:
    Tomcat启动报错java.net.AbstractPlainSocketImpl(java/net/AbstractPlainSocketImpl.java:178:-1)Struts在网络复杂情况下启动报错解决办法
    webpack入门级教程
    jquery-ui sortable 使用实例
    JS-类型转换
    JavaScript语言核心--词法结构
    理解CSS盒子模型
    HTML DOCTYPE 标签
    2015总结和2016计划
    MVC & MVVM
    前端常见问题汇总
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7351212.html
Copyright © 2011-2022 走看看