在做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:
- 
<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;  
- 
  
- 
 
- 
 
- 
 
- 
 
- 
  
- 
public class SQLdm {    
- 
        
- 
      
- 
    String filePath = "data/data/com.datab.cn/test.db";    
- 
      
- 
    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+"");  
- 
                      
- 
                    FileOutputStream fos=new FileOutputStream(jhPath);    
- 
                    Log.i("test", "fos="+fos);  
- 
                    Log.i("test", "jhPath="+jhPath);  
- 
                      
- 
                    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) {    
- 
                      
- 
                    e.printStackTrace();    
- 
                    return null;  
- 
                }    
- 
                  
- 
                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 {  
- 
      
- 
    @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);  
- 
          
- 
        Cursor cursor = db.rawQuery("select * from testbiao where testid=?", new String[]{"1"});   
- 
        String name = null;  
- 
        if(cursor.moveToFirst()){    
- 
            name = cursor.getString(cursor.getColumnIndex("name"));  
- 
        }    
- 
          
- 
        textv.setText(name);  
- 
        cursor.close();    
- 
    }  
- 
}</span>  
 
我们的main.xml视图也贴出来吧,很简单,一看就懂了。
![]()
然后,我们在虚拟机上看看我们的界面是什么样的:
![]()
可以看到,我们得到了数据库中的数据了,接下来大家可以把bin目录下的apk文件放入到真机中测试,依然会得到数据库中的数据