数据库管理类中使用到的是自定义的Context,而非app的上下文对象:



  1. /**  
  2.  * 用于支持对存储在SD卡上的数据库的访问  
  3.  **/  
  4. public class DbContext extends ContextWrapper {  
  5.   
  6.     /**  
  7.      * 构造函数  
  8.      *   
  9.      * @param base  
  10.      *            上下文环境  
  11.      */  
  12.     public DbContext(Context base) {  
  13.         super(base);  
  14.     }  
  15.   
  16.     /**  
  17.      * 获得数据库路径,如果不存在,则创建对象对象  
  18.      *   
  19.      * @param name  
  20.      * @param mode  
  21.      * @param factory  
  22.      */  
  23.     @Override  
  24.     public File getDatabasePath(String name) {  
  25.         // 判断是否存在sd卡  
  26.         boolean sdExist = android.os.Environment.MEDIA_MOUNTED  
  27.                 .equals(android.os.Environment.getExternalStorageState());  
  28.         if (!sdExist) {// 如果不存在,  
  29.             Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");  
  30.             return null;  
  31.         } else {// 如果存在  
  32.                 // 获取sd卡路径  
  33.             String dbDir = android.os.Environment.getExternalStorageDirectory()  
  34.                     .getAbsolutePath();  
  35.             dbDir += "/database";// 数据库所在目录  
  36.             String dbPath = dbDir + "/" + name;// 数据库路径  
  37.             // 判断目录是否存在,不存在则创建该目录  
  38.             File dirFile = new File(dbDir);  
  39.             if (!dirFile.exists())  
  40.                 dirFile.mkdirs();  
  41.   
  42.             // 数据库文件是否创建成功  
  43.             boolean isFileCreateSuccess = false;  
  44.             // 判断文件是否存在,不存在则创建该文件  
  45.             File dbFile = new File(dbPath);  
  46.             if (!dbFile.exists()) {  
  47.                 try {  
  48.                     isFileCreateSuccess = dbFile.createNewFile();// 创建文件  
  49.                 } catch (IOException e) {  
  50.                     // TODO Auto-generated catch block  
  51.                     e.printStackTrace();  
  52.                 }  
  53.             } else  
  54.                 isFileCreateSuccess = true;  
  55.   
  56.             // 返回数据库文件对象  
  57.             if (isFileCreateSuccess)  
  58.                 return dbFile;  
  59.             else  
  60.                 return null;  
  61.         }  
  62.     }  
  63.   
  64.     /**  
  65.      * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。  
  66.      *   
  67.      * @param name  
  68.      * @param mode  
  69.      * @param factory  
  70.      */  
  71.     @Override  
  72.     public SQLiteDatabase openOrCreateDatabase(String name, int mode,  
  73.             SQLiteDatabase.CursorFactory factory) {  
  74.         SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(  
  75.                 getDatabasePath(name), null);  
  76.         return result;  
  77.     }  
  78.   
  79.     /**  
  80.      * Android 4.0会调用此方法获取数据库。  
  81.      *   
  82.      * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String,  
  83.      *      int, android.database.sqlite.SQLiteDatabase.CursorFactory,  
  84.      *      android.database.DatabaseErrorHandler)  
  85.      * @param name  
  86.      * @param mode  
  87.      * @param factory  
  88.      * @param errorHandler  
  89.      */  
  90.     @Override  
  91.     public SQLiteDatabase openOrCreateDatabase(String name, int mode,  
  92.             CursorFactory factory, DatabaseErrorHandler errorHandler) {  
  93.         SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(  
  94.                 getDatabasePath(name), null);  
  95.         return result;  
  96.     }  
  97. }  
文章转自威客网
10-30 05:00