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