我们平时见到的android数据库操作一般都是在程序开始时创建一个空的数据库,然后再进行相关操作。如果我们需要使用一个已有数据的数据库怎么办呢?
我们都知道android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录。
操作方法:1. 把原数据库包括在项目源码的 res/raw 目录下,然后建立一个DBManager类,代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package  com.android.ImportDatabase;   import  java.io.File; import  java.io.FileNotFoundException; import  java.io.FileOutputStream; import  java.io.IOException; import  java.io.InputStream;   import  android.content.Context; import  android.database.sqlite.SQLiteDatabase; import  android.os.Environment; import  android.util.Log;   public  class  DBManager {      private  final  int  BUFFER_SIZE = 400000 ;      public  static  final  String DB_NAME = "countries.db" ; //保存的数据库文件名      public  static  final  String PACKAGE_NAME = "com.android.ImportDatabase" ;      public  static  final  String DB_PATH = "/data"              + Environment.getDataDirectory().getAbsolutePath() + "/"              + PACKAGE_NAME;  //在手机里存放数据库的位置        private  SQLiteDatabase database;      private  Context context;        DBManager(Context context) {          this .context = context;      }        public  void  openDatabase() {          this .database = this .openDatabase(DB_PATH + "/"  + DB_NAME);      }        private  SQLiteDatabase openDatabase(String dbfile) {          try  {              if  (!( new  File(dbfile).exists())) {   //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库                  InputStream is = this .context.getResources().openRawResource(                          R.raw.countries); //欲导入的数据库                  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();              }              SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,                      null );              return  db;          } catch  (FileNotFoundException e) {              Log.e( "Database" , "File not found" );              e.printStackTrace();          } catch  (IOException e) {              Log.e( "Database" , "IO exception" );              e.printStackTrace();          }          return  null ;      }
?
1 //do something else here
?
1 2 3 4      public  void  closeDatabase() {          this .database.close();      } }

然后在程序的首个Activity中示例化一个DBManager对象,然后对其执行openDatabase方法就可以完成导入了,可以把一些要对数据库进行的操作写在DBManager类里,然后通过DBManager类的对象调用;也可以在完成导入之后通过一个SQliteDatabase类的对象打开数据库,并执行操作。

我的做法是 在程序的首个Activity中导入数据库:

?
1 2 3 4 5 6 7 8 9 package  com.android.ImportDatabase;   import  android.app.Activity; import  android.content.Intent; import  android.os.Bundle;   public  class  RootView extends  Activity {        public  DBManager dbHelper;
?
1 2 3 4 5 6 7 8 9 10 11 12      @Override      public  void  onCreate(Bundle savedInstanceState) {            super .onCreate(savedInstanceState);          setContentView(R.layout.main);            dbHelper = new  DBManager( this );          dbHelper.openDatabase();          dbHelper.closeDatabase();        } }

此时在DDMS中可以查看到,外部数据库已经成功导入

在需要使用数据库的类里:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package  com.android.ImportDatabase;   import  java.util.ArrayList; import  android.app.Activity; import  android.database.Cursor; import  android.database.sqlite.SQLiteDatabase; import  android.os.Bundle;   public  class  TaxiActivity extends  Activity {        private  SQLiteDatabase database;          ArrayList CITY;        @Override      public  void  onCreate(Bundle savedInstanceState) {            super .onCreate(savedInstanceState);          setContentView(R.layout.main);                    database = SQLiteDatabase.openOrCreateDatabase(DBManager.DB_PATH + "/"  + DBManager.DB_NAME, null );            CITY = getCity();                    // do something with CITY            database.close();      }        private  ArrayList getCity() {                    Cursor cur = database.rawQuery( "SELECT city.id_city, city.name FROM taxi, city WHERE city.id_city = taxi.id_city GROUP BY city.id_city" , null );                    if  (cur != null ) {              int  NUM_CITY = cur.getCount();              ArrayList taxicity = new  ArrayList(NUM_CITY);              if  (cur.moveToFirst()) {                  do  {                      String name = cur.getString(cur.getColumnIndex( "name" ));                      int  id = cur.getInt(cur.getColumnIndex( "id_city" ));                      CityClass city = new  CityClass( "" , 0 );                      System.out.println(name);  //额外添加一句,把select到的信息输出到Logcat                      city.city_name = name;                      city.city_id = id;                      taxicity.add(city);                  } while  (cur.moveToNext());              }              return  taxicity;          } else  {              return  null ;          }      } }

查看输出的结果:

更多相关文章

  1. Android(安卓)SQlite数据库的使用(一)-一学就会android数据库
  2. Android的事件传递机制
  3. 浅谈Android五大布局(一)——LinearLayout、FrameLayout和Absoulte
  4. Android之父Andy Rubin访谈录
  5. Android(安卓)数据库操作 以及命令行上操作sqlite
  6. 【android】Sqlite中使用SQL与其他数据库的区别
  7. Pure Android
  8. SQLite的使用
  9. android 使用mediaplayer播放网络音乐

随机推荐

  1. Android中Task任务栈的分配
  2. android 摄像头相关使用记录
  3. android 动态设置 WebView 的宽高
  4. Android(安卓)Studio问题收集
  5. Android中TextView图文并茂,可以同时放图
  6. Android修炼之道—google android设计规
  7. [置顶] Android ril移植-6410开发板SIM30
  8. Android framework回顾(3)binder利用及IBin
  9. android之属性动画
  10. Android(安卓)Studio升级3.5 打包报错 Ca