android 導入已有的外部數據庫

方法一、把reba.db數據庫放在在android項目的 res文件夾下raw文件夾中

SQLitedb.java


public class SQLitedb {
	private final int BUFFER_SIZE = 400000;
	public static final String DB_NAME = "reba.db"; // 保存的數據庫文件名
	public static final String PACKAGE_NAME = "com.develop.demo";//包名
	public static final String DB_PATH = "/data"
			+ Environment.getDataDirectory().getAbsolutePath() + "/"
			+ PACKAGE_NAME; // 在手機裏存放數據庫的位置(/data/data/com.develop.demo/reba.db)

	private SQLiteDatabase database;
	private Context context;

	public DBManager(Context context) {
		this.context = context;
	}

	public SQLiteDatabase getDatabase() {
		return database;
	}

	public void setDatabase(SQLiteDatabase database) {
		this.database = database;
	}

	public void openDatabase() {
		System.out.println(DB_PATH + "/" + DB_NAME);
		this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
	}
    /**導入打開數據庫*/
	private SQLiteDatabase openDatabase(final String dbfile) {
		new Thread() {
			public void run() {

				try {
					if (!(new File(dbfile).exists())) {
						// 判斷數據庫文件是否存在,若不存在則執行導入,否則直接打開數據庫
						InputStream is = context.getResources()
								.openRawResource(R.raw.reba); // 欲導入的數據庫
						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) {
					Log.e("Database", "File not found");
					e.printStackTrace();
				} catch (IOException e) {
					Log.e("Database", "IO exception");
					e.printStackTrace();
				}

			}
		}.start();

		if (new File(dbfile).exists()) {
			SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
					null);
			return db;
		}
			return null;
	}
	/**關閉數據庫*/
	public void closeDatabase() {
		if (this.database != null){
			this.database.close();
		    this.database = null;
		}
		
	}
}

主Activity中示例化一個SQLitedb對象
MainAcivity.java

public class MainActivity extends Activity {

	
	public SQLitedb sqldb;
        /** 本地數據庫 **/
        public static SQLiteDatabase database = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 //首次執行導入.db文件
        sqldb = new SQLitedb(this);
        sqldb.openDatabase();
        sqldb.closeDatabase();
        database = SQLiteDatabase.openOrCreateDatabase(SQLitedb.DB_PATH + "/"
                                                            + SQLitedb.DB_NAME, null);
	}	
 }


方法二、把reba數據庫放在在android項目的 assets 文件夾中

SQLitedb.java



public class SQLitedb {
	private final int BUFFER_SIZE = 400000;
	public static final String DB_NAME = "reba"; // 保存的數據庫文件名
	public static final String PACKAGE_NAME = "faai.develop.cailiao";// 包名
	public static final String DB_PATH = "/data"
			+ Environment.getDataDirectory().getAbsolutePath() + "/"
			+ PACKAGE_NAME + "/databases"; // 在手機裏存放數據庫的位置(/data/data/faai.develop.cailiao/databases/reba)

	private SQLiteDatabase database;
	private Context context;

	public DBManager(Context context) {
		this.context = context;
	}

	public SQLiteDatabase getDatabase() {
		return database;
	}

	public void setDatabase(SQLiteDatabase database) {
		this.database = database;
	}

	public void openDatabase() {
		System.out.println(DB_PATH + "/" + DB_NAME);
		this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
	}

	/** 導入打開數據庫 */
	private SQLiteDatabase openDatabase(final String dbfile) {
		new Thread() {
			public void run() {

				if ((new File(DB_PATH + "/" + DB_NAME)).exists() == false) {
					File f = new File(DB_PATH);
					if (!f.exists()) {
						f.mkdir();
					}

					try {
						// 得到assets目錄下我們準備好的sqlite數據庫作爲輸入流
						InputStream is = context.getAssets().open(
								DB_NAME);
						OutputStream os = new FileOutputStream(DB_PATH + "/"
								+ DB_NAME);

						// 文件寫入
						byte[] buffer = new byte[1024];
						int length;
						System.out.println("reading start!");
						while ((length = is.read(buffer)) > 0) {
							os.write(buffer, 0, length);
							System.out.println(buffer);
						}
						System.out.println("reading end!");
						// 關閉流文件
						os.flush();
						os.close();
						is.close();
					} catch (FileNotFoundException e) {
						Log.e("Database", "File not found");
						e.printStackTrace();
					} catch (IOException e) {
						Log.e("Database", "IO exception");
						e.printStackTrace();
					}

				}
			}
		}.start();

		if (new File(dbfile).exists()) {
			SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
					null);
			return db;
		}
		return null;
	}

	/** 關閉數據庫 */
	public void closeDatabase() {
		if (this.database != null) {
			this.database.close();
			this.database = null;
		}

	}
}


主Activity中示例化一個SQLitedb對象
MainAcivity.java

public class MainActivity extends Activity {

	
	public SQLitedb sqldb;
        /** 本地數據庫 **/
        public static SQLiteDatabase database = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		 //首次執行導入.db文件
        sqldb = new SQLitedb(this);
        sqldb.openDatabase();
        sqldb.closeDatabase();
        database = SQLiteDatabase.openOrCreateDatabase(SQLitedb.DB_PATH + "/"
                                                            + SQLitedb.DB_NAME, null);
	}	
 }

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章