안녕하세요. 아침의 맑은 공기를 마시며... 어려운 과제를 ㅜ...
어플 배포시에 db가 초기화되기 때문에 asset폴더에서 db를 포함시키는 방법이 있다고 해서 구현해 보고 있습니다.
복사 부분은 빨간색으로 표시해놓았습니다. 소스상에 에러는 발견되지 않았구요.. 에뮬에서 잘돌아갑니다..
하지만 단말기에서 실행시켰을 경우 db가 업데이트 되지 않네요.. ㅠㅠ
처음 db를 생성시에 asset폴더에 생성을 시킨후에복사를 시켜야 하는건가요?..
많은 도움 부탁드립니다.
package material.data.db;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
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;
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 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";
public void copydb(Activity act) {
AssetManager am = act.getAssets();
File f = new File("/data/data/material.data.db/databases/Material.db");
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
InputStream is = am.open("Material.db");
BufferedInputStream bis = new BufferedInputStream(is);
// 만약에 파일이 있다면 지우고 다시 생성
if (f.exists()) {
f.delete();
f.createNewFile();
}
fos = new FileOutputStream(f);
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();
fos.close();
bos.close();
is.close();
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@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();
}
//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());
}
}
}
그리고 업뎃이 되지 않는 이유가..처음에 파일복사가 안되어서 인가요...
아니면 쿼리쪽이 문제인가요-_-..저렇게 적어두면...아무도 몰라요.....저 같은 허접은..ㅠ.ㅠ
일단 db가 지정된 내부 경로에 저장이 되는거는 확인이 가능해서 db 빼와서 데이터브라우져 같은걸로 수정할수는 있는데요... 궁금한건asset 폴더에 db가 생성이 되어야 저게 복사가 진행이 되는걸까요?apk 배포시에 ㅠ
아마도 파일이 생성이 제대로 안되었다면, IOException이 발생했을텐데, Exception 메시지 내용을 확인해 보시면 도움이 될 것 같네요.
음... 에뮬실행시에 문제점은 없어 보입니다..ㅜ log 메시지가 안뜨네요... 음 혹시 asset 폴더에 db를 저장하고나서 복사해야 되는건가요?;;
아... log보니까 exception메시지가 있네요...ㅜㅜ
10-07 03:03:30.275: ERROR/Zygote(32): setreuid() failed. errno: 2
10-07 03:03:41.605: ERROR/Zygote(32): setreuid() failed. errno: 17
10-07 03:03:43.816: ERROR/BatteryService(65): usbOnlinePath not found
10-07 03:03:43.816: ERROR/BatteryService(65): batteryVoltagePath not found
10-07 03:03:43.816: ERROR/BatteryService(65): batteryTemperaturePath not found
10-07 03:03:43.845: ERROR/SurfaceFlinger(65): Couldn't open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake
10-07 03:03:53.246: ERROR/EventHub(65): could not get driver version for /dev/input/mouse0, Not a typewriter
10-07 03:03:53.246: ERROR/EventHub(65): could not get driver version for /dev/input/mice, Not a typewriter
10-07 03:03:53.585: ERROR/System(65): Failure starting core service
10-07 03:03:53.585: ERROR/System(65): java.lang.SecurityException
10-07 03:03:53.585: ERROR/System(65): at android.os.BinderProxy.transact(Native Method)
10-07 03:03:53.585: ERROR/System(65): at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146)
10-07 03:03:53.585: ERROR/System(65): at android.os.ServiceManager.addService(ServiceManager.java:72)
10-07 03:03:53.585: ERROR/System(65): at com.android.server.ServerThread.run(SystemServer.java:184)
10-07 03:03:55.035: ERROR/SoundPool(65): error loading /system/media/audio/ui/Effect_Tick.ogg
10-07 03:03:55.048: ERROR/SoundPool(65): error loading /system/media/audio/ui/KeypressStandard.ogg
10-07 03:03:55.048: ERROR/SoundPool(65): error loading /system/media/audio/ui/KeypressSpacebar.ogg
10-07 03:03:55.056: ERROR/SoundPool(65): error loading /system/media/audio/ui/KeypressDelete.ogg
10-07 03:03:55.056: ERROR/SoundPool(65): error loading /system/media/audio/ui/KeypressReturn.ogg
10-07 03:03:59.367: ERROR/ThrottleService(65): Could not open GPS configuration file /etc/gps.conf
10-07 03:04:00.856: ERROR/logwrapper(145): executing /system/bin/tc failed: No such file or directory
10-07 03:04:00.955: ERROR/logwrapper(150): executing /system/bin/tc failed: No such file or directory
10-07 03:04:01.075: ERROR/logwrapper(152): executing /system/bin/tc failed: No such file or directory
10-07 03:04:32.712: ERROR/ActivityManager(65): ANR in android.process.media
10-07 03:04:32.712: ERROR/ActivityManager(65): Reason: Broadcast of Intent { act=android.intent.action.BOOT_COMPLETED cmp=com.android.providers.downloads/.DownloadReceiver }
10-07 03:04:32.712: ERROR/ActivityManager(65): Load: 4.87 / 1.22 / 0.41
10-07 03:04:32.712: ERROR/ActivityManager(65): CPU usage from 6676ms to 320ms ago:
10-07 03:04:32.712: ERROR/ActivityManager(65): system_server: 32% = 19% user + 12% kernel / faults: 625 minor 6 major
10-07 03:04:32.712: ERROR/ActivityManager(65): d.process.media: 19% = 9% user + 10% kernel / faults: 3395 minor 6 major
10-07 03:04:32.712: ERROR/ActivityManager(65): m.android.phone: 14% = 9% user + 4% kernel / faults: 1096 minor 2 major
10-07 03:04:32.712: ERROR/ActivityManager(65): d.process.acore: 13% = 10% user + 2% kernel / faults: 478 minor
10-07 03:04:32.712: ERROR/ActivityManager(65): ndroid.launcher: 11% = 7% user + 3% kernel / faults: 856 minor 2 major
10-07 03:04:32.712: ERROR/ActivityManager(65): bootanimation: 8% = 8% user + 0% kernel / faults: 2 minor
10-07 03:04:32.712: ERROR/ActivityManager(65): rild: 1% = 0% user + 1% kernel / faults: 2 minor
10-07 03:04:32.712: ERROR/ActivityManager(65): servicemanager: 0% = 0% user + 0% kernel
10-07 03:04:32.712: ERROR/ActivityManager(65): qemud: 0% = 0% user + 0% kernel
10-07 03:04:32.712: ERROR/ActivityManager(65): adbd: 0% = 0% user + 0% kernel / faults: 10 minor
10-07 03:04:32.712: ERROR/ActivityManager(65): ronsoft.openwnn: 0% = 0% user + 0% kernel / faults: 130 minor
10-07 03:04:32.712: ERROR/ActivityManager(65): events/0: 0% = 0% user + 0% kernel
10-07 03:04:32.712: ERROR/ActivityManager(65): kswapd0: 0% = 0% user + 0% kernel
10-07 03:04:32.712: ERROR/ActivityManager(65): +id.defcontainer: 0% = 0% user + 0% kernel
10-07 03:04:32.712: ERROR/ActivityManager(65): TOTAL: 100% = 61% user + 38% kernel
10-07 03:04:43.125: ERROR/HierarchicalStateMachine(65): TetherMaster - unhandledMessage: msg.what=3
그 Exception은 지금 소스와는 관계가 없는것 같고...
Exception이 발생하더라도 catch구문에서 잡힐 것이기 때문에, Logcat에는 안찍힐 것입니다.
e.getMessage() 같은 메서드를 이용해서 에러 메시지를 확인해 보시면 도움이 될 것 같네요.




공개된 소스 고대로 가져다 쓰셧군요..
저렇게 자르지 마시고요...mp3 포멧으로 변형하면 되구...
업데이트는 프레프런스를 사용해서 앱 처음실행시키면 디비를 복사하구, ..종료할때 종료시간 저장해서
그 종료시간을 조건으로 조건무 돌리셔서 업데이트 작업 수행하시면 될것 같네요..