import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* assets폴더에있는 zipcode.db파일을
* 내부 저장소의 databases폴더에 옮기는 작업
*/
public class DatabaseContacts {
private DatabaseHelper DBHelper;
private SQLiteDatabase sql;
public DatabaseContacts(Context context) {
DBHelper = new DatabaseHelper(context);
}
// DB헬퍼 초기화
public boolean initDatabase() {
boolean dbInit = DBHelper.initDatabase();
DBHelper.openDataBase();
return dbInit;
}
private static class DatabaseHelper extends SQLiteOpenHelper {
public static final String ROOT_DIR = "/data/data/패키지명/";
public static final String DB_PATH = ROOT_DIR + "databases/";
public static final String DB_NAME = "이름.db";
public static final int DB_VER = 1;
private boolean isCreateDatabase = false;
private boolean isUpgradeDatabase = false;
private SQLiteDatabase sqlite;
private final Context context;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VER);
this.context = context;
}
public boolean initDatabase() {
boolean isInit = false;
boolean isCatchExcept = false;
getWritableDatabase();
if (isCreateDatabase) {
Utils.Log("isCreateDatabase=" + isCreateDatabase);
try {
copyDatabase();
isInit = true;
close();
} catch (Exception e) {
isCatchExcept = true;
}
} else if (isUpgradeDatabase) {
Utils.Log("isUpgradeDatabase=" + isUpgradeDatabase);
try {
copyDatabase();
isInit = true;
close();
} catch (Exception e) {
isCatchExcept = true;
}
}
if (!isCatchExcept) {
isInit = true;
}
return isInit;
}
@Override
public void onCreate(SQLiteDatabase db) {
isCreateDatabase = true;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
isUpgradeDatabase = true;
}
public void createDatabase() throws IOException {
try {
getReadableDatabase();
copyDatabase();
close();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
public boolean hasDatabase() {
boolean hasDB = false;
File dbFile = context.getDatabasePath(DB_NAME);
if (dbFile.exists()) {
hasDB = true;
} else {
hasDB = false;
}
return hasDB;
}
private void copyDatabase() throws IOException {
InputStream myInput = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
ReadableByteChannel src = Channels.newChannel(myInput);
WritableByteChannel dest = Channels.newChannel(myOutput);
try {
if (src != null && dest != null) {
final ByteBuffer buffer = ByteBuffer.allocateDirect(8 * 1024);
while (src.read(buffer) != -1) {
// prepare the buffer to be drained
buffer.flip();
// write to the channel, may block
dest.write(buffer);
// If partial transfer, shift remainder down
// If buffer is empty, same as doing clear()
buffer.compact();
}
// EOF will leave buffer in fill state
buffer.flip();
// make sure the buffer is fully drained.
while (buffer.hasRemaining()) {
dest.write(buffer);
}
}
} catch (Exception e) {
// TODO: handle exception
Utils.Log("error occured copy channel" + e);
} finally {
try {
if (src != null) {
src.close();
}
if (dest != null) {
dest.close();
}
if (myOutput != null) {
myOutput.flush();
myOutput.close();
}
} catch (Exception e) {
// TODO: handle exception
Utils.Log("error occured copy channel" + e);
}
}
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
sqlite = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
close();
}
@Override
public synchronized void close() {
if (sqlite != null) {
sqlite.close();
}
super.close();
}
}
public SQLiteDatabase dbwrite() throws SQLException {
sql = DBHelper.getWritableDatabase();
return sql;
}
public SQLiteDatabase dbread() throws SQLException {
sql = DBHelper.getReadableDatabase();
return sql;
}
public void closeDB() {
DBHelper.close();
}
}
InputStream myInput = context.getAssets().open(DB_NAME);
Url호출하는부분에...
URL url = new URL();
InputStream is = url.openStream();
여기부분 myInput으로 잡아주시고
public static final String ROOT_DIR = "/data/data/패키지명/";
public static final String DB_PATH = ROOT_DIR + "databases/";
public static final String DB_NAME = "db이름";
이부분만 수정해 사용 하시면 될거같습니다
//DB 복사부분
dbadapter = new DatabaseContacts(getApplicationContext());
dbadapter.initDatabase();//AsyncTask나 Thread를 이용한 백그라운드 작업필요
//받아온DB 사용부분
SQLiteDatabase sql = dbadapter.dbread();
cursor = sql.rawQuery("SELECT DISTINCT sido FROM zipcode", null);
while (cursor.moveToNext()) {
sido_list.add((cursor.getString(cursor.getColumnIndex("sido"))));
}
cursor.close();
sql.close();
요런식으로...