当我们软件中要使用大量数据,我们会选择将这些数据存储到一个数据库中,然后通过数据库的查询修改操作来管理这些数据。大多数情况下我们都只在程序中建立使用数据库,但也有我们在程序中只是使用的数据库,并不在程序中建立它们,因为这种数据库往往数据量比较大,我们在建立时如果不采用多线程和后台服务的话,很容易导致前台界面的阻塞停滞,这样往往会影响用户体验,造成不好的使用效果。这时我们可不可以直接建好数据库并录入数据,然后通过程序将数据库正确导入进我们的软件文件夹里面。这样减少了读取数据和建立数据库的时间,可以在很大程度上提高软件响应的速度。
还是结合之前做的一个软件的天气预报功能开发的实例来讲解如何导入外部数据库。首先我们通过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()方法将数据库导入。如果数据库比较大可以在后台开线程进行操作。