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

db 에러인데 원인을 못찾겠어요...

0 추천
03-21 17:36:59.712: E/AndroidRuntime(29394): FATAL EXCEPTION: main
03-21 17:36:59.712: E/AndroidRuntime(29394): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.toeic/com.example.toeic.Stage_m_lessonActivity}: java.lang.NullPointerException
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1892)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread.access$600(ActivityThread.java:127)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.os.Looper.loop(Looper.java:137)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread.main(ActivityThread.java:4512)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at java.lang.reflect.Method.invokeNative(Native Method)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at java.lang.reflect.Method.invoke(Method.java:511)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at dalvik.system.NativeStart.main(Native Method)
03-21 17:36:59.712: E/AndroidRuntime(29394): Caused by: java.lang.NullPointerException
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.content.ContextWrapper.getResources(ContextWrapper.java:81)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at com.example.toeic.toeicDBManager.copyDB(toeicDBManager.java:133)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at com.example.toeic.toeicDBManager.<init>(toeicDBManager.java:32)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at com.example.toeic.Stage_m_lessonActivity.<init>(Stage_m_lessonActivity.java:64)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at java.lang.Class.newInstanceImpl(Native Method)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at java.lang.Class.newInstance(Class.java:1319)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.Instrumentation.newActivity(Instrumentation.java:1026)
03-21 17:36:59.712: E/AndroidRuntime(29394):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1883)
03-21 17:36:59.712: E/AndroidRuntime(29394):  ... 11 more
 

 

여기서 이상한 점이. 액티비티가 2개(공부모드, 반복모드)가 있다면요

반복모드를 들어갈 경우에는 저런 에러가 나는데,

공부모드로 가면 db가 정상적으로 열리고 다시 반복모드를 가면

정상적으로 열립니다;;

제 db에 문제가 있는건지 확인을 해봤는데 문제가 전혀 없어 보이는데 이런 현상이 발생하네요...

public class toeicDBManager {

 Context     mContext;
 String    mPath = "/data/data/com.example.toeic06/db";
 String    mFileName = "toeic";
 SQLiteDatabase   mDb;
 
 
 //반복모드의 틀린 문제 정보를 같는 테이블 생성
 String mCreateTableWrongInfo = "CREATE TABLE IF NOT EXISTS tbl_limit_wronginfo ( try_count INTEGER, wrong_count INTEGER, wrong_q_info TEXT)";
 
 public PocketDBManager(Context context) {
  
  mContext = context;
  
  File db = new File(mPath + File.separator + mFileName);
  if (!db.exists()) {
   copyDB();
  }
  
  
 }

 public void open() {
  File db = new File(mPath + File.separator + mFileName);
  if (!db.exists()) {
   copyDB();
  }
  
  mDb = SQLiteDatabase.openDatabase(mPath + File.separator + mFileName,
       null, SQLiteDatabase.OPEN_READWRITE|SQLiteDatabase.NO_LOCALIZED_COLLATORS);

 }
                  public void close() {
  mDb.close();
  mDb = null;
 }
 
 protected boolean copyDB() {
  try {
   File dir = new File(mPath);
   if (!dir.exists())
    dir.mkdirs();
  
   File outfile = new File(mPath + File.separator + mFileName);
   AssetManager assMgr = mContext.getResources().getAssets();
   InputStream in = assMgr.open("database/toeic.db", AssetManager.ACCESS_BUFFER);
   long filesize = in.available();
   
   byte[] tempData = new byte[(int)filesize];
   in.read(tempData);
   in.close();
   outfile.createNewFile();
   FileOutputStream outFile = new FileOutputStream(outfile);
   outFile.write(tempData);
   outFile.close();
   
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  }
  
  return true;
 }
 
 public boolean initDB() {
  File db = new File(mPath + File.separator + mFileName);
  if (!db.delete())
   return false;
  
  if (!copyDB())
   return false;
  
  return true;
 }
이게뭐야d (1,040 포인트) 님이 2013년 3월 21일 질문

1개의 답변

0 추천
이건 공부모드에서 db가 초기화되서 그런겁니다... Application 에서 db를 초기화하시면 되요(전역변ㄴ수)

그리고 DBHelper비추입니다.. openOrCreateDatbase함수가 성능상 낫다고합니다 (출처.. 까마득한 기억)
수상한i (8,050 포인트) 님이 2013년 3월 21일 답변
...