1 public class MyDB extends SQLiteOpenHelper { 2 // 数据库的缺省路径 3 private static String DB_PATH ; 4 private static final String DB_NAME = "aa.db"; 5 private static final int DB_VERSION = 2; 6 private SQLiteDatabase m_database; 7 private final Context m_context; 8 /** 9 * 10 * Constructor 11 * 12 * 保存传进来的context参数以用来访问应用的asset和raw文件。 13 * 14 * @param context 15 */ 16 public MyDB(Context context) { 17 super(context, DB_NAME, null, DB_VERSION); 18 this.m_context = context; 19 DB_PATH ="/data/data/"+context.getPackageName()+"/databases/"; 20 } 21 public static MyDB openDatabaseReadOnly(Context context) { 22 MyDB db = new MyDB(context); 23 try { 24 db.createDataBase(); 25 } catch (IOException e) { 26 e.printStackTrace(); 27 } 28 db.openDataBase(SQLiteDatabase.OPEN_READONLY); 29 return db; 30 } 31 public static MyDB openDatabaseReadWrite(Context context) { 32 MyDB db = new MyDB(context); 33 try { 34 db.createDataBase(); 35 } catch (IOException e) { 36 e.printStackTrace(); 37 } 38 db.openDataBase(SQLiteDatabase.OPEN_READWRITE); 39 return db; 40 } 41 /** 42 * 43 * 创建一个空数据库,用来存储你已有的数据库。 44 */ 45 public void createDataBase() throws IOException { 46 boolean dbExist = checkDataBase(); 47 if (dbExist) { 48 // 如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时 49 // 传进去的是可写的数据库。 50 SQLiteDatabase db = this.getWritableDatabase(); 51 if (db != null) { 52 db.close(); 53 } 54 } 55 dbExist = checkDataBase(); 56 if (!dbExist) { 57 try { 58 // 调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制我们已有的数据库。 59 SQLiteDatabase db = this.getReadableDatabase(); 60 if (db != null) { 61 db.close(); 62 } 63 copyDataBase(); 64 } catch (IOException e) { 65 Log.e("DB", e.getMessage()); 66 throw new Error("Error copyingdatabase"); 67 } 68 } 69 } 70 /** 71 * 72 * 检查数据库是否已存在,以避免重复复制。 73 * 74 * @return true if it exists, false if itdoesn't 75 */ 76 private static boolean checkDataBase() { 77 SQLiteDatabase checkDB = null; 78 try { 79 String path = DB_PATH + DB_NAME; 80 checkDB = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY); 81 } 82 catch (SQLiteException e) { 83 e.printStackTrace(); 84 } 85 if (checkDB != null) { 86 checkDB.close(); 87 } 88 return checkDB != null ? true : false; 89 } 90 /** 91 * 92 * 把存在asset文件中的数据库复制的刚创建的空数据库中。 93 * 94 * */ 95 private void copyDataBase() throws IOException { 96 // 刚创建的空数据库的路径 97 String outFileName = DB_PATH + DB_NAME; 98 // 打开空数据库 99 OutputStream output = new FileOutputStream(outFileName); 100 byte[] buffer = new byte[1024]; 101 // AssetManager assetMgr = m_context.getAssets(); 102 // 打开分解的asset文件 103 // InputStream input = assetMgr.open(fn); 104 InputStream input =m_context.getResources().openRawResource(R.raw.area); 105 int length; 106 while ((length = input.read(buffer)) !=-1) { 107 output.write(buffer, 0, length); 108 } 109 input.close(); 110 output.flush(); 111 output.close(); 112 } 113 /** 114 * 115 * 打开数据库。 116 * 117 * */ 118 private void openDataBase(int flags) throws SQLException { 119 120 String myPath = DB_PATH + DB_NAME; 121 m_database = SQLiteDatabase.openDatabase(myPath, null, flags); 122 } 123 /** 124 * 125 * 关闭数据库。 126 * 127 * */ 128 @Override 129 public synchronized void close() { 130 if (m_database != null) 131 m_database.close(); 132 super.close(); 133 } 134 @Override 135 public void onCreate(SQLiteDatabase db) {} 136 /** 137 * 138 * 在数据库版本提高时,删除原有数据库。 139 * 140 * */ 141 @Override 142 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 143 if (newVersion > oldVersion) { 144 m_context.deleteDatabase(DB_NAME); 145 } 146 } 147 }
String path = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY);
REFERENCES:http://www.apkbus.com/home.php?mod=space&uid=151485&do=blog&quickforward=1&id=53675