Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android導入外部數據庫

Android導入外部數據庫

編輯:關於Android編程

當我們軟件中要使用大量數據,我們會選擇將這些數據存儲到一個數據庫中,然後通過數據庫的查詢修改操作來管理這些數據。大多數情況下我們都只在程序中建立使用數據庫,但也有我們在程序中只是使用的數據庫,並不在程序中建立它們,因為這種數據庫往往數據量比較大,我們在建立時如果不采用多線程和後台服務的話,很容易導致前台界面的阻塞停滯,這樣往往會影響用戶體驗,造成不好的使用效果。這時我們可不可以直接建好數據庫並錄入數據,然後通過程序將數據庫正確導入進我們的軟件文件夾裡面。這樣減少了讀取數據和建立數據庫的時間,可以在很大程度上提高軟件響應的速度。

還是結合之前做的一個軟件的天氣預報功能開發的實例來講解如何導入外部數據庫。首先我們通過DDMS看一下數據庫的存放路徑,一般情況下數據庫的存放路徑為:/data/packagname/databases/( packagname指的是我們所建立的工程的包名,例如這裡我的包名就是com.liuproject.reminder。有的數據庫就直接在packagname下面,有的則是在databases目錄下,大家可以打開DDMS看一下。)如圖databases文件夾下面有兩個數據庫:

其中City(上圖為導入成功後的截圖)就是我們即將要從外部導入的數據庫。我們將建好的City數據庫文件拷貝到我們所建工程的assets文件夾中,如下圖所示:

\

要注意我們所提供的外部數據要和我們設計的將在軟件中使用的數據庫保持一致,及時每一條記錄的屬性值名稱和數據類型一致。數據准備完成後我們就可以開始導入外部數據庫了。具體實現源碼如下:

 

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
 
public class ImportDB{
    private final int BUFFER_SIZE = 10000;
    public static final String DB_NAME = "City"; //保存的數據庫文件名
    public static final String PACKAGE_NAME = "com.liuproject.reminder";//工程包名
    public static final String DB_PATH = "/data"
            + Environment.getDataDirectory().getAbsolutePath() + "/"
            + PACKAGE_NAME+"/databases";  //在手機裡存放數據庫的位置
private Context context;
 
   ImportDB(Context context) {
        this.context = context;
    }
   
    public void copyDatabase() {
             String dbfile=DB_PATH + "/" + DB_NAME ;
        try {
           //執行數據庫導入
                InputStream is = this.context.getResources().getAssets().open("City"); //欲導入的數據庫
                FileOutputStream fos = new FileOutputStream(dbfile);
                byte[] buffer = new byte[BUFFER_SIZE];
                int count = 0;
                while ((count = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, count);
                }              
                fos.close();//關閉輸出流
                is.close();//關閉輸入流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
}
通過上面的這個class我們就可以將存放在assets文件夾中的外部數據庫導入到我們所需要的文件目錄下。接著開始建立我們在程序中所要使用的數據庫類,如下代碼:
class CityDB extends SQLiteOpenHelper{//城市Id數據庫操作
         private final String DB_NAME="CityID";//數據庫名稱
          public CityDB(Context context,String name,CursorFactory factory,int version) {
                   super(context, name,factory, version);
          }
 
         @Override
         public void onCreate(SQLiteDatabase db) {             
                    String createDB= "create table "+DB_NAME+"(cityid varchar(14) primary key , cityname varchar(20),type int)";//數據庫中記錄的屬性名稱及屬性值類型
                    db.execSQL(createDB);//創建數據庫
         }
 
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                     String dropTableSQL = "DROP TABLE IF EXISTS "  + DB_NAME + " ";
                     db.execSQL(dropTableSQL);
                     dropTableSQL = "DROP TABLE IF EXISTS " + DB_NAME   + " ";
                     db.execSQL(dropTableSQL);
                     onCreate(db);     
         }
          
         public void execSQL(String sql, Object[] args) {//執行操作
                   SQLiteDatabase db = this.getWritableDatabase();
                   db.execSQL(sql, args);
         }
 
         public Cursor query(String sql, String[] args) {//返回操作結果指針
                   SQLiteDatabase db = this.getWritableDatabase();
                   Cursor cursor = db.rawQuery(sql, args);
                   return cursor;
         }
}
在之後的程序中我們就可以通過new CityDB(this, NAME, null, VERSION);來創建一個數據庫操作輔助對象,其中的NAME要與我們之間導入的外部數據庫名稱一致,在我的例子裡面NAME=“City”,VERSION為數據庫的版本號,盡量保持與前面建立時的一致性。在程序合適的位置使用ImportDB類的copyDatabase()方法將數據庫導入。如果數據庫比較大可以在後台開線程進行操作。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved