现在的位置: 首页 > 综合 > 正文

Util工具类 db文件和apk一起发布

2018年05月21日 ⁄ 综合 ⁄ 共 3027字 ⁄ 字号 评论关闭
package com.example.demo.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

/**
 * Is derived from the
 * [http://www.cnblogs.com/shannyn/archive/2012/06/09/2543334.html]
 * 
 * ubuntu sqlite3 command [http://blog.sina.com.cn/s/blog_74dfa9f401017s69.html]
 * 
 * @author wangpeng
 * 
 *         I am make a little change!!
 */
public class DBImportUtil {

	/**
	 * 导入db所在包名
	 */
	private String PACKAGE_NAME;

	/**
	 * db名
	 */
	private String DATABASE_NAME;
	/**
	 * db所在资源
	 */
	private int DATABASE_RESOURCE;
	/**
	 * 导入db路径
	 */
	private String DATABASE_PATH;
	/**
	 * 导入db完整路径
	 */
	private String OUT_FILE_NAME;
	private final int DATABASE_VERSION = 1;
	private Context context;
	private SQLiteDatabase database;

	private static DBImportUtil mDBImportUtil;

	/**
	 * 覆盖原来的数据库内容
	 * 
	 * @author wangpeng
	 */
	public static boolean OVERRIDE = false;

	public static DBImportUtil newInstance(Context context) {
		if (mDBImportUtil == null)
			mDBImportUtil = new DBImportUtil(context);
		return mDBImportUtil;
	}

	private DBImportUtil(Context context) {
		this.context = context;
	}

	public void doImport(String packageName, String databaseName, int databaseResource) {
		initParams(packageName, databaseName, databaseResource);

		File file = new File(OUT_FILE_NAME);
		if (file.exists()) {
			database = SQLiteDatabase.openOrCreateDatabase(OUT_FILE_NAME, null);
			if (database.getVersion() != DATABASE_VERSION) {
				database.close();
				file.delete();
			}
		}
		try {
			buildDatabase();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			mDBImportUtil = null;
		}

	}

	private void buildDatabase() throws Exception {
		InputStream myInput = context.getResources().openRawResource(DATABASE_RESOURCE);
		File file = new File(OUT_FILE_NAME);

		File dir = new File(DATABASE_PATH);
		if (!dir.exists()) {
			if (!dir.mkdir()) {
				throw new Exception("create fail!");
			}
		}
		/**
		 * 数据库文件不存在(即第一次安装)或者 指定去进行覆盖去写入数据库文件
		 * 
		 * @author wangpeng
		 */
		if (!file.exists() || OVERRIDE) {
			try {
				OutputStream myOutput = new FileOutputStream(OUT_FILE_NAME);

				byte[] buffer = new byte[1024];
				int length;
				while ((length = myInput.read(buffer)) > 0) {
					myOutput.write(buffer, 0, length);
				}
				myOutput.close();
				myInput.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@SuppressLint("SdCardPath")
	private void initParams(String packageName, String databaseName, int databaseResource) {
		PACKAGE_NAME = packageName;
		DATABASE_NAME = databaseName;
		DATABASE_RESOURCE = databaseResource;
		DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases";
		OUT_FILE_NAME = DATABASE_PATH + "/" + DATABASE_NAME;
	}
}

然后Mainactivity调用,一般放在 SplashScreenActivity 这种位置。即应用第一次安装的过场动画的位置

package com.example.demo;

import android.app.Activity;
import android.os.Bundle;

import com.example.demo.util.DBImportUtil;
import com.example.demo.util.DatabaseUtil;

public class MainActivity extends Activity {

	final String TAG = "MainActivity";

	DatabaseUtil dbUtil;

	private final String PACKAGE_NAME = "com.example.demo";
	private final String DATABASE_NAME = "easycar.db";

	private final int DATABASE_RESOURCE = R.raw.easycar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 导入db文件
		DBImportUtil.newInstance(this).doImport(PACKAGE_NAME, DATABASE_NAME, DATABASE_RESOURCE);

	}
}

db文件放在

阿

完成

抱歉!评论已关闭.