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文件放在
完成