• [转]读取assets目录下的数据库文件


    在做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:

    1. <span style="font-size:18px;">package com.datab.cn;  
    2.   
    3. import java.io.File;  
    4. import java.io.FileOutputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStream;  
    7.   
    8. import android.content.Context;  
    9. import android.content.res.AssetManager;  
    10. import android.database.sqlite.SQLiteDatabase;  
    11. import android.util.Log;  
    12.   
    13. /** 
    14.  * 这个类就是实现从assets目录读取数据库文件然后写入SDcard中,如果在SDcard中存在,就打开数据库,不存在就从assets目录下复制过去 
    15.  * @author Big_Adamapple 
    16.  * 
    17.  */  
    18. public class SQLdm {    
    19.         
    20.     //数据库存储路径    
    21.     String filePath = "data/data/com.datab.cn/test.db";    
    22.     //数据库存放的文件夹 data/data/com.main.jh 下面    
    23.     String pathStr = "data/data/com.datab.cn";    
    24.         
    25.     SQLiteDatabase database;     
    26.     public  SQLiteDatabase openDatabase(Context context){    
    27.         System.out.println("filePath:"+filePath);    
    28.         File jhPath=new File(filePath);    
    29.             //查看数据库文件是否存在    
    30.             if(jhPath.exists()){    
    31.                 Log.i("test", "存在数据库");  
    32.                 //存在则直接返回打开的数据库    
    33.                 return SQLiteDatabase.openOrCreateDatabase(jhPath, null);    
    34.             }else{    
    35.                 //不存在先创建文件夹    
    36.                 File path=new File(pathStr);    
    37.                 Log.i("test", "pathStr="+path);  
    38.                 if (path.mkdir()){    
    39.                     Log.i("test", "创建成功");   
    40.                 }else{    
    41.                     Log.i("test", "创建失败");  
    42.                 };    
    43.                 try {    
    44.                     //得到资源    
    45.                     AssetManager am= context.getAssets();    
    46.                     //得到数据库的输入流    
    47.                     InputStream is=am.open("test.db");    
    48.                     Log.i("test", is+"");  
    49.                     //用输出流写到SDcard上面      
    50.                     FileOutputStream fos=new FileOutputStream(jhPath);    
    51.                     Log.i("test", "fos="+fos);  
    52.                     Log.i("test", "jhPath="+jhPath);  
    53.                     //创建byte数组  用于1KB写一次    
    54.                     byte[] buffer=new byte[1024];    
    55.                     int count = 0;    
    56.                     while((count = is.read(buffer))>0){    
    57.                         Log.i("test", "得到");  
    58.                         fos.write(buffer,0,count);    
    59.                     }    
    60.                     //最后关闭就可以了    
    61.                     fos.flush();    
    62.                     fos.close();    
    63.                     is.close();    
    64.                 } catch (IOException e) {    
    65.                     // TODO Auto-generated catch block    
    66.                     e.printStackTrace();    
    67.                     return null;  
    68.                 }    
    69.                 //如果没有这个数据库  我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了    
    70.                 return openDatabase(context);    
    71.             }    
    72.     }    
    73. }  
    74. </span>  


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

    1. <span style="font-size:18px;">package com.datab.cn;  
    2.   
    3. import android.app.Activity;  
    4. import android.database.Cursor;  
    5. import android.database.sqlite.SQLiteDatabase;  
    6. import android.os.Bundle;  
    7. import android.widget.TextView;  
    8.   
    9. public class DatabActivity extends Activity {  
    10.     /** Called when the activity is first created. */  
    11.     @Override  
    12.     public void onCreate(Bundle savedInstanceState) {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.main);  
    15.           
    16.         //打开数据库输出流  
    17.         SQLdm s = new SQLdm();  
    18.         SQLiteDatabase db =s.openDatabase(getApplicationContext());   
    19.           
    20.         TextView textv = (TextView) findViewById(R.id.textv);  
    21.         //查询数据库中testid=1的数据  
    22.         Cursor cursor = db.rawQuery("select * from testbiao where testid=?", new String[]{"1"});   
    23.         String name = null;  
    24.         if(cursor.moveToFirst()){    
    25.             name = cursor.getString(cursor.getColumnIndex("name"));  
    26.         }    
    27.         //这是一个TextView,把得到的数据库中的name显示出来.  
    28.         textv.setText(name);  
    29.         cursor.close();    
    30.     }  
    31. }</span>  

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

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



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

  • 相关阅读:
    【CUDA开发】CUDA面内存拷贝用法总结
    【CUDA开发】CUDA编程接口(一)------一十八般武器
    【CUDA开发】CUDA编程接口(一)------一十八般武器
    【计算机视觉】OPENCV对于有alpha通道的透明背景图片的读取和图片叠加
    【计算机视觉】OPENCV对于有alpha通道的透明背景图片的读取和图片叠加
    【CUDA开发】论CUDA和LAV解码器是否真的实用
    【CUDA开发】论CUDA和LAV解码器是否真的实用
    【VS开发】网络SOCKET编程INADDR_ANY选项
    【VS开发】网络SOCKET编程INADDR_ANY选项
    【FFMPEG】I,P,B帧和PTS,DTS时间戳的关系
  • 原文地址:https://www.cnblogs.com/xunbu7/p/4882571.html
Copyright © 2020-2023  润新知