2013-09-22 2 views
0

도와주세요. 첫 번째 앱 버전에서 DBHelper에 DB_PATH가 잘못 작성되었으며 설치 후 apk가 데이터베이스를 찾을 수 없다는 예외가 있습니다. (다음 응용 프로그램 버전) 난 지금 DB_PATH을 썼다 그러나 나는 다음 APK 성공적인 설치 캐시를 지우기로 APK를 다시 설치하는 경우 이후에 GET 예외활동을 시작할 수 없습니다. ComponentInfo : android.database.sqlite.SQLiteException : 컴파일 중 해당 테이블이 없습니다.

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo: android.database.sqlite.SQLiteException: no such table: category: , while compiling: SELECT * FROM category 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3691) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteException: no such table: category: , while compiling: SELECT * FROM category 
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1497) 
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1376) 
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1330) 
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1450) 
    at package.name.MainPage.update(MainPage.java:125) 
    at package.name.MainPage.onCreate(MainPage.java:88) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
    ... 11 more 

설치! 캐시를 지우고 다시 설치하지 않고 어떻게 성공적으로 설치할 수 있습니까?

Main.class가

 ... 
    public class MainPage extends MainHelper implements OnClickListener{ 
    ... 
    public void onCreate(Bundle savedInstanceState) { 
    ... 
      DBHelper myDbHelper = new DBHelper(this); 

      String oldpath = "/data/data/package.name1/databases/"; 
      String newpath = "/data/data/package.name/databases/"; 
      File dbFile = new File(newpath+"db.sqlite"); 

     if (!dbFile.exists()) { 
     try { 
      myDbHelper.copyDataBase(oldpath); 
      myDbHelper.myContext.deleteDatabase(oldpath+bd_name); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
     } 

     try {  
       myDbHelper.createDataBase();   
     } catch (IOException ioe) {  
      throw new Error("Unable to create database");   
     } 
    .... 
    } 
    } 

DBHelper

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBHelper extends SQLiteOpenHelper{ 

    private static String DB_PATH = "/data/data/package.name/databases/"; 
    private static String DB_NAME = "db.sqlite"; 
    private SQLiteDatabase myDataBase; 
    public final Context myContext; 

    public DBHelper(Context context) { 
     super(context, DB_NAME, null, 1); 
     this.myContext = context; 
    } 

    public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 
     if(dbExist){ 
     }else{ 
      this.getReadableDatabase();   

      try { 
       copyDataBase(DB_PATH); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 
     } 

    } 

    private boolean checkDataBase(){ 
     File dbFile = new File(DB_PATH + DB_NAME); 
     return dbFile.exists(); 
    } 

    public void copyDataBase(String bdpath) throws IOException{ 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 
     String outFileName = bdpath + DB_NAME; 
     OutputStream myOutput = new FileOutputStream(outFileName); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } 

    public void openDataBase() throws SQLException{ 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

    @Override 
    public synchronized void close() { 

      if(myDataBase != null) 
       myDataBase.close(); 

      super.close(); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

답변

1

나는 당신이 당신는 CH된다

을 다음 않는 DB 작업을 수행하기 전에 솔루션


을 알고 있다고 생각 새로운 DB의 PATH에서 DB의 존재 에크는

그것이 아닌 경우

그런 다음

{이 될 것으로 예상된다} 기존 DB의 PATH에서 복사 존재하지 않는 경우 그 또한

그런 다음

+0

추가 DBHelper.class –

+0

난 그게 내가 OLDBDPATH에서 DB를 복사 할 수있는 방법 바보 같은 질문에 대한 – Trikaldarshi

+0

죄송합니다 ..) DB 도우미의 필요가없는 문제를 해결할 쓴 너 한테 읽어 데이터베이스 작성 ?) 고맙습니다 –

관련 문제