늦은 밤까지 고생하십니다.

 

안드로이드 DB에 관해 공부하고 있는 학생입니다.

 

안드로이드 에뮬레이터로 실행시켰을때는 외부에서 (엑셀로 만든 csv 파일을 sqlite database browser을 이용하여 DB로 변환) 만든 파일을 이클

 

립스의 데이터베이스(data/data/패키지이름/databases/데이터베이스이름)의 경로로 복사해서 사용했을때 에뮬레이터상에서는 문제없이 입력과

 

조회 삭제 수정이 이상없이 작동되었습니다.

 

그런데 apk파일을 핸드폰으로 옮긴 후 에 설치해서 사용해보았더니, 데이터 베이스 파일이 에뮬레이터에서처럼 유지가 되지않고 초기 상태로

 

되어 있었습니다. 여기 저기 뒤지다가 assets 폴더에 DB 파일을 복사하면 apk파일을 핸드폰에 넣을때 DB 파일도 유지가 된다는 것을 알게 되었

 

는데 (확실한지는 모르겠습니다.) 그 부분에서 질문드립니다. 핸드폰의 어플이 설치된 경로로 직접 DB를 복사해서 사용해보았는데 작동되지

 

않았습니다. 고수님들 어린양에게 많은 도움 부탁드립니다. ㅜ

 

관련 소스 올리겠습니다. 늦은 밤까지 짧지 않은글 읽어주셔서 감사합니다.ㅜ

 

package material.data.db;

import android.app.Activity;

import android.content.Context;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

import java.io.InputStream;

import java.io.FileOutputStream;

import java.io.File;

import java.io.IOException;

import android.content.res.AssetManager;

import java.io.BufferedOutputStream;

import java.io.BufferedInputStream;

 

 

public class ASMSActivity extends Activity implements OnTouchListener {

/** Called when the activity is first created. */

private Button createB, dropB, insertB, updateB, deleteB, selectB;

private EditText et1, et2, et3;

private SQLiteDatabase db;

private final static String DB_NAME="Material.db"; //DB name setting

private final static int DB_MODE=Context.MODE_PRIVATE;

private final static String T_NAME="material";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

createB = (Button)findViewById(R.id.b01);

dropB = (Button)findViewById(R.id.b02);

insertB = (Button)findViewById(R.id.b03);

updateB = (Button)findViewById(R.id.b04);

deleteB = (Button)findViewById(R.id.b05);

selectB = (Button)findViewById(R.id.bselect);

createB.setOnTouchListener((OnTouchListener) this);

dropB.setOnTouchListener((OnTouchListener) this);

insertB.setOnTouchListener((OnTouchListener) this);

updateB.setOnTouchListener((OnTouchListener) this);

deleteB.setOnTouchListener((OnTouchListener) this);

selectB.setOnTouchListener((OnTouchListener) this);

et1 = (EditText)findViewById(R.id.et01);

et2 = (EditText)findViewById(R.id.et02);

et3 = (EditText)findViewById(R.id.et03);

openDB();

}

private void copySQLiteDB(Context context){                 >>>  빨간 부분이 현재 asset으로 db복사를 하기 위한 구문입니다.

AssetManager manager = context.getAssets();                      

String filePath ="/data/data" + "/material.data.db" + "/databases" + "/Material.db";

File file = new File(filePath);

FileOutputStream fos = null;

BufferedOutputStream bos = null;

try{

InputStream is = manager.open("D:" + "/aaaaaaa/AndroidShipManagementSystem/assets" + "/database"+"/Material.db");

BufferedInputStream bis = new BufferedInputStream(is);

if(file.exists()){

file.delete();

file.createNewFile();

}

fos=new FileOutputStream(file);

bos=new BufferedOutputStream(fos);

int read=-1;

byte[] buffer=new byte[1024];

while((read=bis.read(buffer, 0, 1024)) != -1){

bos.write(buffer, 0, read);

}

bos.flush();

bos.close();

fos.close();

bis.close();

is.close();

}catch(IOException e){

Log.e("ErrorMessage : ", e.getMessage());

}

}

//DB open

private void openDB(){

db = openOrCreateDatabase(DB_NAME, DB_MODE, null);

showToast("DB("+DB_NAME+")생성 or 열림");

}

//Message

private void showToast(String msg) {

// TODO Auto-generated method stub

Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();

}

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

if(v == createB){

createTable();

}else if(v == dropB){

dropTable();

}else if(v == insertB){

insertData();

}else if(v == updateB){

updateData();

}else if(v == deleteB){

deleteData();

}else{ //v == selectB

selectData();

}

return false;

}

//SQL Process

private boolean execSQL(String sql){

try{

db.execSQL(sql);

return true;

}catch (SQLException se) {

// TODO: handle exception

return false;

}

}

//Data Select

private void selectData() {

// TODO Auto-generated method stub

String sql = "SELECT name, location, number FROM ";

sql += T_NAME;

sql += " WHERE name = \"";

sql += et1.getText().toString();

sql += "\"";

Log.e("selectData(): ",sql);

try{

Cursor cur = db.rawQuery(sql, null);

cur.moveToFirst();

if(cur.getCount() > 0){

et2.setText(cur.getString(1));

et3.setText(cur.getString(cur.getColumnIndex("number")));

}else{

showToast("조회 데이타가 없습니다.");

}

}catch (SQLException se) {

// TODO: handle exception

Log.e("selectData()Error! : ",se.toString());

}

}

//Data Delete

private void deleteData() {

// TODO Auto-generated method stub

String sql = "DELETE FROM ";

sql += T_NAME;

sql += " WHERE name = \"";

sql += et1.getText().toString();

sql += "\"";

if(!this.execSQL(sql)){

showToast("Data("+T_NAME+")delete Error!");

}else{

showToast("Data("+T_NAME+")delete OK!");

}

}

//Data Update

private void updateData() {

// TODO Auto-generated method stub

String sql = "UPDATE ";

sql += T_NAME;

sql += " SET ";

sql += " location = '";

sql += et2.getText().toString();

sql += "', number = '";

sql += et3.getText().toString();

sql += "' WHERE name = \"";

sql += et1.getText().toString();

sql += "\"";

if(!this.execSQL(sql)){

showToast("Data("+T_NAME+")update Error!");

}else{

showToast("Data("+T_NAME+")update OK!");

}

}

//Data Insert

private void insertData() {

// TODO Auto-generated method stub

String sql = "INSERT INTO ";

sql += T_NAME;

sql += "(name,location,number,ddate) VALUES ( '";

sql += et1.getText().toString();

sql += "', '";

sql += et2.getText().toString();

sql += "', '";

sql += et3.getText().toString();

sql += "', ";

sql += "date('now') )";

if(!this.execSQL(sql)){

showToast("Data("+T_NAME+")insert Error!");

}else{

showToast("Data("+T_NAME+")insert OK!");

}

}

//Table Drop

private void dropTable() {

// TODO Auto-generated method stub

String sql = "drop table ";

sql += T_NAME;

try{

db.execSQL(sql);

showToast("Table("+T_NAME+")삭제 완료!");

}catch (SQLException se) {

// TODO: handle exception

Log.e("dropTable()Error! : ",se.toString());

}

}

//Table Create

private void createTable() {

// TODO Auto-generated method stub

String sql = "create table ";

sql += T_NAME;

sql += "(_id integer primary key autoincrement, name text not null, location text not null, ";

sql += "number text default 'one', ddate date)";

try{

db.execSQL(sql);

showToast("Table("+T_NAME+")생성 완료!");

}catch (SQLException se) {

// TODO: handle exception

//Log.e("createTable()시오류 : ",se.toString());

}

}

}

 

 

긴 글 읽어주셔서 감사합니다..

 

부디 도움부탁드리겠습니다. ㅜ