很多時候在應用安裝初始化時,需要創建本地數據庫,同時為數據庫添加數據,之后再從數據庫中讀取數據。
這里有2個思路
1.先在本地創建一個能支持android使用的sqlite數據庫文件,啟動時,用現成的sqlite的二進制文件進行直接copy到Android系統的數據庫路徑
2.可以考慮在第一次啟動時,執行數據庫初始化的sql文件.
1.在本地准備android能使用的sqlite數據庫文件
使用sqlite數據庫管理工具,看個人愛好(SQLite Database Browser ,Navicat Premium,)
打開數據庫,創建"android_metadata"數據表
- CREATE TABLE "android_metadata" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT,"locale" TEXT DEFAULT 'en_US');//創建表
- INSERT INTO "android_metadata" VALUES (1,'en_US');//插入值
創建其他應用需要的表..此處省略.
2.復制文件到應用中.
把第一步創建的數據庫文件復制到應用中的assets文件夾, asserts文件夾的路徑如下:
然后創建DateBaseHelper extends SQLiteOpenHelper的類文件.
代碼如下:
- public class DataBaseHelper extends SQLiteOpenHelper {
- //The Android's default system path of your application database.
- private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
- private static String DB_NAME = "myDBName";
- private SQLiteDatabase myDataBase;
- private final Context myContext;
- /**
- * Constructor
- * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
- * @param context
- */
- public DataBaseHelper(Context context) {
- super(context, DB_NAME, null, 1);
- this.myContext = context;
- }
- /**
- * Creates a empty database on the system and rewrites it with your own database.
- * */
- public void createDataBase()throws IOException {
- boolean dbExist = checkDataBase();
- if (dbExist) {
- //do nothing - database already exist
- } else {
- //By calling this method and empty database will be created into the default system path
- //of your application so we are gonna be able to overwrite that database with our database.
- this.getReadableDatabase();
- try {
- copyDataBase();
- } catch (IOException e) {
- throw new Error("Error copying database");
- }
- }
- }
- /**
- * Check if the database already exist to avoid re-copying the file each time you open the application.
- * @return true if it exists, false if it doesn't
- */
- private boolean checkDataBase() {
- SQLiteDatabase checkDB = null;
- try {
- String myPath = DB_PATH + DB_NAME;
- checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
- } catch (SQLiteException e) {
- //database does't exist yet.
- }
- if (checkDB != null) {
- checkDB.close();
- }
- return checkDB != null ? true : false;
- }
- /**
- * Copies your database from your local assets-folder to the just created empty database in the
- * system folder, from where it can be accessed and handled.
- * This is done by transfering bytestream.
- * */
- private void copyDataBase()throws IOException {
- //Open your local db as the input stream
- InputStream myInput = myContext.getAssets().open(DB_NAME);
- // Path to the just created empty db
- String outFileName = DB_PATH + DB_NAME;
- //Open the empty db as the output stream
- OutputStream myOutput = new FileOutputStream(outFileName);
- //transfer bytes from the inputfile to the outputfile
- byte[]buffer = new byte[1024];
- int length;
- while ((length = myInput.read(buffer)) > 0) {
- myOutput.write(buffer, 0, length);
- }
- //Close the streams
- myOutput.flush();
- myOutput.close();
- myInput.close();
- }
- public void openDataBase()throws SQLException {
- //Open the database
- String myPath = DB_PATH + DB_NAME;
- myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
- }
- @Override
- public synchronized void close() {
- if (myDataBase != null)
- myDataBase.close();
- super.close();
- }
- @Override
- public void onCreate(SQLiteDatabase db) {}
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
- // Add your public helper methods to access and get content from the database.
- // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
- // to you to create adapters for your views.
- }
3.現在我們可以創建DateBaseHelper的實現操作了.
createDataBase() //創建
openDataBase()//打開只讀數據庫
記得要更改"YOUR_PACKAGE"為你的應用的包名
如:com.examplename.myapp
大概代碼如下:
- ...
- DataBaseHelper myDbHelper = new DataBaseHelper();
- myDbHelper = new DataBaseHelper(this);
- try {
- myDbHelper.createDataBase();
- } catch (IOException ioe) {
- throw new Error("Unable to create database");
- }
- try {
- myDbHelper.openDataBase();
- } catch (SQLException sqle) {
- throw sqle;
- }
- ...