• Android 数据库打包随APK发布


    原文地址:http://gundumw100.iteye.com/blog/1671352

    有些时候我们的软件用到SQLite数据库,这个时候怎么把一个做好的数据库打包进我们的APK呢,其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的时候可以,我觉得在软件起动页里效果更好一点,首先我们应该把事先写好的数据库文件比如 test.db放到res文件夹里的raw文件夹里,也可以放到assets里,因为这两个文件夹不会在生成APK的时候不会被压缩。 1,DataBaseUtil用于将raw中的db文件copy到手机中,代码如下

    Java代码 复制代码 收藏代码
    1. import java.io.File; 
    2. import java.io.FileOutputStream; 
    3. import java.io.IOException; 
    4. import java.io.InputStream; 
    5.  
    6. import android.content.Context; 
    7. import android.database.sqlite.SQLiteDatabase; 
    8. import android.database.sqlite.SQLiteException; 
    9.  
    10. import com.ata.app.R; 
    11.  
    12. /**
    13. * copy数据库到apk包
    14. *
    15. * @author NGJ
    16. *
    17. */ 
    18. publicclass DataBaseUtil { 
    19.  
    20.     private Context context; 
    21.     publicstatic String dbName = "Kao.db";// 数据库的名字 
    22.     privatestatic String DATABASE_PATH;// 数据库在手机里的路径 
    23.  
    24.     public DataBaseUtil(Context context) { 
    25.         this.context = context; 
    26.         String packageName = context.getPackageName(); 
    27.         DATABASE_PATH="/data/data/"+packageName+"/databases/"
    28.     } 
    29.  
    30.     /**
    31.      * 判断数据库是否存在
    32.      *
    33.      * @return false or true
    34.      */ 
    35.     publicboolean checkDataBase() { 
    36.         SQLiteDatabase db = null
    37.         try
    38.             String databaseFilename = DATABASE_PATH + dbName; 
    39.             db = SQLiteDatabase.openDatabase(databaseFilename, null,SQLiteDatabase.OPEN_READONLY); 
    40.         } catch (SQLiteException e) { 
    41.  
    42.         } 
    43.         if (db != null) { 
    44.             db.close(); 
    45.         } 
    46.         return db != null ? true : false
    47.     } 
    48.  
    49.     /**
    50.      * 复制数据库到手机指定文件夹下
    51.      *
    52.      * @throws IOException
    53.      */ 
    54.     publicvoid copyDataBase() throws IOException { 
    55.         String databaseFilenames = DATABASE_PATH + dbName; 
    56.         File dir = new File(DATABASE_PATH); 
    57.         if (!dir.exists())// 判断文件夹是否存在,不存在就新建一个 
    58.             dir.mkdir(); 
    59.         FileOutputStream os = new FileOutputStream(databaseFilenames);// 得到数据库文件的写入流 
    60.         InputStream is = context.getResources().openRawResource(R.raw.kao);// 得到数据库文件的数据流 
    61.         byte[] buffer = newbyte[8192]; 
    62.         int count = 0
    63.         while ((count = is.read(buffer)) > 0) { 
    64.             os.write(buffer, 0, count); 
    65.             os.flush(); 
    66.         } 
    67.         is.close(); 
    68.         os.close(); 
    69.     } 
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    
    import com.ata.app.R;
    
    /**
     * copy数据库到apk包
     * 
     * @author NGJ
     * 
     */
    public class DataBaseUtil {
    
    	private Context context;
    	public static String dbName = "Kao.db";// 数据库的名字
    	private static String DATABASE_PATH;// 数据库在手机里的路径
    
    	public DataBaseUtil(Context context) {
    		this.context = context;
    		String packageName = context.getPackageName();
    		DATABASE_PATH="/data/data/"+packageName+"/databases/";
    	}
    
    	/**
    	 * 判断数据库是否存在
    	 * 
    	 * @return false or true
    	 */
    	public boolean checkDataBase() {
    		SQLiteDatabase db = null;
    		try {
    			String databaseFilename = DATABASE_PATH + dbName;
    			db = SQLiteDatabase.openDatabase(databaseFilename, null,SQLiteDatabase.OPEN_READONLY);
    		} catch (SQLiteException e) {
    
    		}
    		if (db != null) {
    			db.close();
    		}
    		return db != null ? true : false;
    	}
    
    	/**
    	 * 复制数据库到手机指定文件夹下
    	 * 
    	 * @throws IOException
    	 */
    	public void copyDataBase() throws IOException {
    		String databaseFilenames = DATABASE_PATH + dbName;
    		File dir = new File(DATABASE_PATH);
    		if (!dir.exists())// 判断文件夹是否存在,不存在就新建一个
    			dir.mkdir();
    		FileOutputStream os = new FileOutputStream(databaseFilenames);// 得到数据库文件的写入流
    		InputStream is = context.getResources().openRawResource(R.raw.kao);// 得到数据库文件的数据流
    		byte[] buffer = new byte[8192];
    		int count = 0;
    		while ((count = is.read(buffer)) > 0) {
    			os.write(buffer, 0, count);
    			os.flush();
    		}
    		is.close();
    		os.close();
    	}
    }
    

    2,在需要的activity中加入如下方法用于具体的copy操作

    Java代码 复制代码 收藏代码
    1. privatevoid copyDataBaseToPhone() { 
    2.         DataBaseUtil util = new DataBaseUtil(this); 
    3.         // 判断数据库是否存在 
    4.         boolean dbExist = util.checkDataBase(); 
    5.  
    6.         if (dbExist) { 
    7.             Log.i("tag", "The database is exist."); 
    8.         } else {// 不存在就把raw里的数据库写入手机 
    9.             try
    10.                 util.copyDataBase(); 
    11.             } catch (IOException e) { 
    12.                 thrownew Error("Error copying database"); 
    13.             } 
    14.         } 
    15.     } 
    private void copyDataBaseToPhone() {
    		DataBaseUtil util = new DataBaseUtil(this);
    		// 判断数据库是否存在
    		boolean dbExist = util.checkDataBase();
    
    		if (dbExist) {
    			Log.i("tag", "The database is exist.");
    		} else {// 不存在就把raw里的数据库写入手机
    			try {
    				util.copyDataBase();
    			} catch (IOException e) {
    				throw new Error("Error copying database");
    			}
    		}
    	}
    

    3,检测是否有SDCard,执行copy。(个人感觉可以不检测SD卡是否存在,但不检测似乎有个问题,程序原因?)

    Java代码 复制代码 收藏代码
    1. boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 
    2.         if(hasSDCard){ 
    3.             copyDataBaseToPhone(); 
    4.         }else
    5.             showToast("未检测到SDCard"); 
    6.         } 
    boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    		if(hasSDCard){
    			copyDataBaseToPhone();
    		}else{
    			showToast("未检测到SDCard");
    		}
    
  • 相关阅读:
    用__new__ 创建单例模式
    函数的列表作为默认参数
    循环闭包函数打印列表
    斐波那契函数和回调函数
    类的共享属性
    字典和format用法
    python 面试大全: 01_类变量在内部是作为字典处理的
    git 学习删除某次提交
    mysql调优
    re模块
  • 原文地址:https://www.cnblogs.com/ericyuan/p/3349311.html
Copyright © 2020-2023  润新知