마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

jsp페이지로부터 파일을 다운받을 때 경로 설정하는법

0 추천
jsp페이지에 접속을 해서 db파일을 하나 내려받습니다.

 

현재 경로를 설정하는 방법을 몰라 디폴트경로에 내려받고 있는것같은데 ..(download 폴더인것같습니다.)

 

이 파일을 안드로이드 sqlite 데이터베이스 경로에 넣어서 사용하고싶은데 방법을 잘 모르겠습니다.

 

때문에 rawSQL을 이용하여 sql명령어를 실행하여도 테이블을 찾을 수 없다는 익셉션이 발생합니다.

 

다운로드 받은 파일을 해당 경로로 옮기는 방법 또는 해당 경로로 애초에 다운로드 받는 방법을 알고싶습니다.

 

혹시 도움을 주실 수 있다면 감사하겠습니다 ...
음무 (17,820 포인트) 님이 2014년 7월 8일 질문

1개의 답변

+1 추천
 
채택된 답변
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();
요런식으로...

 

whdrb19 (23,520 포인트) 님이 2014년 7월 8일 답변
음무님이 2014년 7월 9일 채택됨
...