1. 程式人生 > >Android 如何匯入已有的外部資料庫

Android 如何匯入已有的外部資料庫

Android 如何匯入已有的外部資料庫

我們平時見到的android資料庫操作一般都是在程式開始時建立一個空的資料庫,我們然後在進行相關操作。這個我們就比較好做了,因為這個資料庫是我們一開始就跟著這個應用走的,那麼我們有的時候不可能什麼都是自己去做的。我們要是需要使用一個已有資料的資料庫怎麼辦呢?大家想一想在android系統下資料庫應該存放在什麼地方吶,我們要是知道資料庫存放在什麼地方就好辦了,現在大家有沒有思路了。沒有的話,就跟我們eoe慢慢的來做。我們知道android的資料庫存放在/data/data/com.*.*(package name)/ 目錄下,所以我們需要做的是把已有的資料庫傳入那個目錄下。操作方法是用FileInputStream

讀取原資料庫,再用 FileOutputStream把讀取到的東西寫入到那個目錄。這樣就可以了,大家這回明白了吧,那麼我就爛看看在程式碼中是怎麼實現的。

                操作方法:1. 把原資料庫包括在專案原始碼的res/raw目錄下,然後建立一個DBManager類,程式碼如下:

Java程式碼:package eoe.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;
}

 然後在程式的首個Activity中示例化一個DBManager物件,然後對其執行openDatabase方法就可以完成匯入了,可以把一些要對資料庫進行的操作寫在DBManager類裡,然後通過DBManager類的物件呼叫;也可以在完成匯入之後通過一個SQliteDatabase類的物件開啟資料庫,並執行操作。

                 我的做法是 在程式的首個Activity中匯入資料庫:

Java程式碼:

package EOE.android.ImportDatabase;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class RootView extends Activity {

public DBManager dbHelper;
我們在需要使用資料庫的類裡:

Java程式碼:

package eoe.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<CityClass> 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();

// 做一些事情時

database.close();
}

private ArrayList<CityClass> 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<CityClass> taxicity = new ArrayList<CityClass>(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;
}
}
}
轉至:http://hi.baidu.com/androidyjc/blog/item/d6f911fcffb499ccf3d38512.html