android開發中,導入有數據的sqlite,與apk一起安裝到手機上

sqlite比較常規的使用方式一般是這樣的,就是在程序中新建一個空的數據庫,然後進行增刪改查等一系列的操作,這樣的操作,對於小應用的開發是比較容易滿足需求的,但是有些比較大的應用,包含的數據量比較大,如果在程序中,對數據進行一條一條的插入,第一,比較耗時,第二,用戶體驗很差,最重要的一點是顯得很不專業。那麼,可以想到的一種比較好的方式,就是如何將db文件與apk一起安裝到手機上呢,實現方法如下:

首先,要有包含數據的sqlite文件,是db類型的,可以是你之前一條一條導入的,然後找到手機路徑下/data/data/包名/database文件,將其導出就可以瞭;

然後,再android工程裡找到assets目錄,將db類型的文件放在該目錄下面,準備就緒之後,上代碼

[java]
public static SQLiteDatabase database; 

public static SQLiteDatabase database;[java] view plaincopyprint?String DB_PATH = "/data/data/com.example.mymap/databases/"; 
        String DB_NAME = "wifi.db"; 
 
 
        // 檢查 SQLite 數據庫文件是否存在  
        if ((new File(DB_PATH + DB_NAME)).exists() == false) { 
            // 如 SQLite 數據庫文件不存在,再檢查一下 database 目錄是否存在  
            File f = new File(DB_PATH); 
            // 如 database 目錄不存在,新建該目錄  
            if (!f.exists()) { 
                f.mkdir(); 
            } 
 
 
            try { 
                // 得到 assets 目錄下我們實現準備好的 SQLite 數據庫作為輸入流  
                InputStream is = getBaseContext().getAssets().open(DB_NAME); 
                // 輸出流  
                OutputStream os = new FileOutputStream(DB_PATH + DB_NAME); 
 
 
                // 文件寫入  
                byte[] buffer = new byte[1024]; 
                int length; 
                while ((length = is.read(buffer)) > 0) { 
                    os.write(buffer, 0, length); 
                } 
 
 
                // 關閉文件流  
                os.flush(); 
                os.close(); 
                is.close(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
 
 
        // 下面測試 /data/data/com.test.db/databases/ 下的數據庫是否能正常工作  
        database = SQLiteDatabase.openOrCreateDatabase(DB_PATH + DB_NAME, null); 
        Cursor cursor = database.rawQuery("select * from wifi_private", null);//這句話沒通過  
         Log.v("111","111"); 
        if (cursor.getCount() > 0) { 
            cursor.moveToFirst(); 
            // 解決中文亂碼問題  
            String SSID = cursor.getString(cursor.getColumnIndex("SSID"));  
            //byte test[] = cursor.getBlob(0);  
            //String strtest = new String(test, "utf-8").trim();  
 
 
            // 看輸出的信息是否正確  
            Log.v("SSID",""+SSID); 
        } 
        cursor.close(); 
         
        Log.v("222","222");  

String DB_PATH = "/data/data/com.example.mymap/databases/";
  String DB_NAME = "wifi.db";

  // 檢查 SQLite 數據庫文件是否存在
  if ((new File(DB_PATH + DB_NAME)).exists() == false) {
   // 如 SQLite 數據庫文件不存在,再檢查一下 database 目錄是否存在
   File f = new File(DB_PATH);
   // 如 database 目錄不存在,新建該目錄
   if (!f.exists()) {
    f.mkdir();
   }

   try {
    // 得到 assets 目錄下我們實現準備好的 SQLite 數據庫作為輸入流
    InputStream is = getBaseContext().getAssets().open(DB_NAME);
    // 輸出流
    OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);

    // 文件寫入
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) > 0) {
     os.write(buffer, 0, length);
    }

    // 關閉文件流
    os.flush();
    os.close();
    is.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

  // 下面測試 /data/data/com.test.db/databases/ 下的數據庫是否能正常工作
     database = SQLiteDatabase.openOrCreateDatabase(DB_PATH + DB_NAME, null);
  Cursor cursor = database.rawQuery("select * from wifi_private", null);//這句話沒通過
         Log.v("111","111");
  if (cursor.getCount() > 0) {
   cursor.moveToFirst();
   // 解決中文亂碼問題
   String SSID = cursor.getString(cursor.getColumnIndex("SSID"));
   //byte test[] = cursor.getBlob(0);
   //String strtest = new String(test, "utf-8").trim();

   // 看輸出的信息是否正確
   Log.v("SSID",""+SSID);
  }
  cursor.close();
       
  Log.v("222","222");

 

這樣一來 數據庫就導入成功瞭,需要註意的一點,該導入進去的數據庫並不會和你程序中創建的數據庫產生沖突(隻要數據庫名不同,表名相不相同無所謂),所以,有些數據是安裝程序的同時導入,有些數據也可以在程序中根據用戶個人的操作進行添加,並不會產生沖突。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。