0

Jelly Bean까지 완벽하게 작동하는 SQLite 데이터베이스에 액세스하는 코드가 있습니다. 모든 데이터가 데이터베이스에서 가져간 것이 아닙니다 (적어도 첫 번째 열은 어떻게 든 생략됩니다) 또한 일부 데이터가 읽혀 지지만 "알 수없는 오류 (코드 14)가 데이터베이스를 열 수 없습니다"라는 오류를 제공합니다. 상황을 이해하지 못하면 자세한 내용을 문의하십시오.안드로이드 Jelly Bean의 SQLite 연결 문제

감사합니다! 여기

private class DataBaseHelper extends SQLiteOpenHelper { 

    private SQLiteDatabase myDataBase; 

    public DataBaseHelper() { 

     super(myContext, DB_NAME, null, 1); 

     DB_PATH = "/data/data/" + myContext.getPackageName() 
       + "/databases/"; 
    } 

    /** 
    * Creates a empty database on the system and rewrites it with your own 
    * database. 
    * */ 
    public void createDataBase() throws IOException { 
     boolean dbExist = checkDataBase(); 
     if (dbExist) { 

      // do nothing - database already exist 
     } else { 
      // By calling this method and empty database will be created 
      // into the default system path 
      // of your application so we are gonna be able to overwrite that 
      // database with our database. 
      this.getReadableDatabase(); 
      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 


    private boolean checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 
      String myPath = myContext.getDatabasePath(DB_NAME).getAbsolutePath(); 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

     } catch (SQLiteException e) { 
      // database does't exist yet. 
     } 

     if (checkDB != null) { 
      checkDB.close(); 
     } 

     return checkDB != null ? true : false; 
    } 

    /** 
    * Copies your database from your local assets-folder to the just 
    * created empty database in the system folder, from where it can be 
    * accessed and handled. This is done by transfering bytestream. 
    * */ 
    private void copyDataBase() throws IOException { 

     // Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DB_NAME; 

     // Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 

     // transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 

     // Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public void openDataBase() throws SQLException { 

     // Open the database 
     String myPath =DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

    } 

는 로그 캣 오류

 01-11 14:36:32.153: E/SQLiteLog(15050): (14) cannot open file at line 30174 of [00bb9c9ce4] 
    01-11 14:36:32.153: E/SQLiteLog(15050): (14) os_unix.c:30174: (2)  open(/data/data/eu.isdc.cabinCrew/databases/database.sqlite) - 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): Failed to open database '/data/data/eu.isdc.cabinCrew/databases/database.sqlite'. 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.b.c(Unknown Source) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.b.a(Unknown Source) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.a.<init>(Unknown Source) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.a.a.a(Unknown  Source) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at eu.isdc.cabinCrew.activities.TrainingActivity.onCreate(Unknown Source) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.Activity.performCreate(Activity.java:5008) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.os.Handler.dispatchMessage(Handler.java:99) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.os.Looper.loop(Looper.java:137) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at android.app.ActivityThread.main(ActivityThread.java:4745) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at java.lang.reflect.Method.invokeNative(Native Method) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at java.lang.reflect.Method.invoke(Method.java:511) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    01-11 14:36:32.183: E/SQLiteDatabase(15050): at dalvik.system.NativeStart.main(Native Method) 
    01-11 14:36:32.503: E/SQLiteLog(15050): (1) no such table: airdata 

그것은 데이터베이스를 열 않습니다,하지만이 경우에도, 해당 테이블을 찾을 수 없습니다. 그리고 이것은 Jelly Bean에서만 발생합니다. 이 버전과의 데이터베이스 상호 작용으로 인해 변경된 사항이 있습니까?

+0

그래서 작동하지 않는 응용 프로그램이 충돌합니까? 그렇다면 충돌의 stracktrace 게시 – hardartcore

+0

자세한 내용은 –

답변

0

이 문제는 종류가 고정되어 있지만 여전히 문제가 있지만 젤리 Bean에서 작동하지 않는 Auto-fit TextView 어댑터를 사용하여 UI에 데이터를 표시하는 데 실제 문제가있는 것으로 나타났습니다. 그래서 여전히 '데이터베이스를 열지 못했습니다'예외가 발생하지만 어쨌든 작동합니다. 데이터베이스가 읽혀집니다.

0

"/ data/data /"에서 데이터베이스를 항상 사용할 수 있다고 가정 할 수 없습니다. 대신 getPath()를 사용하여 db 파일의 경로를 가져와야합니다.

+0

을 추가했습니다. 그래, 그렇긴하지만 그게 문제가 아니며'myContext.getDatabasePath (DB_NAME) .getAbsolutePath(); '로 시도했지만 아무 것도 변경되지 않았습니다. 문제는 데이터베이스가 읽히지 만 부분적이므로 경로가 정상입니다. –