2017-11-01 9 views
0

私はまだアンドロイドを学んでいて、専門家ではありません。私はsqlliteデータベースを扱う際にいくつかの論理的問題があると思う。私が何をしているのか、私が何を得ているのかを説明しましょう。android.database.sqlite.SQLiteCantOpenDatabaseException:未知のエラー(コード14):データベースを開くことができませんでした - アプリケーションのロジック問題

私は引用符を1つ適用しています。私はローカルのデータベースもオンラインで提供しています。私はデータベースファイルをAssetsに含め、ユーザがスプラッシュ画面からアプリケーションを開いたとき初めてデータベースをコピーしました。その後、ユーザーのデバイスに格納され、オンラインデータベースと比較されるローカルデータベースの最終著者と最後の引用番号をチェックしています。オンラインで新しいデータがある場合、私はそれをダウンロードしてスプラッシュスクリーンに保存しています。

のための今私のスプラッシュ画面のコードは、同じやる

DAO database=DAO.getInstance(this); 
int lastAuthor =database.getLastAuthor(); 
String updatesUrl = constant.MainUrl + String.valueOf(lastAuthor)+ "/" + String.valueOf(lastQuote); 

下のマイDAOクラスは、この

public class DBHandler extends SQLiteOpenHelper { 
    private static String DB_PATH; 
    private static String DB_NAME = "xxx"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 
    public DBHandler(Context context) { 

     super(context, DB_NAME, null, constant.DATABASE_VERSION); 
     this.myContext = context; 
     DB_PATH = context.getDatabasePath(DB_NAME).toString(); 
    } 
    public void createDataBase() throws IOException { 

     boolean dbExist = checkDataBase(); 

     if (dbExist) { 
     } else { 

      this.getReadableDatabase(); 

      try { 
       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 
     } 

    } 

    // ============================================================================== 

    /** 
    * Check if the database already exist to avoid re-copying the file each 
    * time you open the application. 
    * 
    * @return true if it exists, false if it doesn't 
    */ 
    private boolean checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 
      String myPath = DB_PATH; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     } catch (SQLiteException e) { 

      // database does't exist yet. 

     } 

     if (checkDB != null) { 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 
    } 


    private void copyDataBase() throws IOException { 

     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     String outFileName = DB_PATH; 

     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 { 


     // Open the database 
     String myPath = DB_PATH; 
     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) { 

    } 


} 
のように見えるこの

public class DAO { 
    private SQLiteDatabase database; 
    private DBHandler dbHandler; 
    private static final String TABLE_QUOTES = "quotes"; 
    private static final String TABLE_AUTHORS = "authors"; 
    private static final String TABLE_SETTINGS = "settings"; 
    private static final String QU_ID = "_quid"; 
    private static final String QU_TEXT = "qu_text"; 
    private static final String QU_AUTHOR = "qu_author"; 
    private static final String QU_FAVORITE = "qu_favorite"; 
    private static final String QU_TIME = "qu_time"; 
    private static final String AU_NAME = "au_name"; 
    private static final String AU_PICTURE = "au_picture"; 
    private static final String AU_PICTURE_SDCARD = "au_picture_sdcard"; 
    private static final String AU_WEB_ID = "au_web_id"; 

    private static DAO dBObject; 
    private final Object lockObj=new Object(); 

    public static DAO getInstance(Context context){ 

     if(dBObject==null)dBObject=new DAO(context); 
     return dBObject; 

    } 


    private DAO(Context context) { 
     synchronized (lockObj) { 
      dbHandler = new DBHandler(context); 
      try { 
       dbHandler.createDataBase(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      dbHandler.openDataBase(); 
      open(); 
     } 
    } 

    public int getLastAuthor() { 

     String query = "SELECT " + AU_WEB_ID + " FROM " + TABLE_AUTHORS 
       + " ORDER BY " + AU_WEB_ID + " DESC LIMIT 1"; 
     Cursor cursor = database.rawQuery(query, null); 

     cursor.moveToFirst(); 
     int tmp = cursor.getInt(cursor.getColumnIndex(AU_WEB_ID)); 
     cursor.close(); 
     return tmp; 

    } 

    // ============================================================================== 

    public int getLastQuote() { 
     String query = "SELECT " + QU_ID + " FROM " + TABLE_QUOTES 
       + " ORDER BY " + QU_ID + " DESC LIMIT 1"; 

     Cursor cursor = database.rawQuery(query, null); 

     cursor.moveToFirst(); 
     int tmp = cursor.getInt(cursor.getColumnIndex(QU_ID)); 

     cursor.close(); 
     return tmp; 
    } 

    // ============================================================================== 

    public void addAuthor(String au_name, String au_picture, int au_web_id) { 
     open(); 
     ContentValues v = new ContentValues(); 
     v.put(AU_NAME, au_name); 
     v.put(AU_PICTURE, au_picture); 
     v.put(AU_PICTURE_SDCARD, 1); 
     v.put(AU_WEB_ID, au_web_id); 

     database.insert(TABLE_AUTHORS, null, v); 

    } 

    // ============================================================================== 

    public void addQuote(String qu_text, int qu_author, int _quid, String qu_time) { 
     open(); 
     ContentValues v = new ContentValues(); 
     v.put(QU_TEXT, qu_text); 
     v.put(QU_AUTHOR, qu_author); 
     v.put(QU_FAVORITE, "0"); 
     v.put(QU_ID, _quid); 
     v.put(QU_TIME, qu_time); 

     database.insert(TABLE_QUOTES, null, v); 

    } 



    // ============================================================================== 

    //method changed 
    private void open() throws SQLException { 
     if(database!=null&&database.isOpen())return; //changed line 
     database = dbHandler.getWritableDatabase(); 

    } 

    // ============================================================================== 

    public void closeDAO(){ 
     synchronized (lockObj){ 
      if(dbHandler!=null)dbHandler.close(); 
      dbHandler=null; 
      database=null; 
     } 
    } 



    public static void dispose(){ 

     if(dBObject!=null){ 
      dBObject.closeDAO(); 
     } 
     dBObject=null; 
    } 

} 

そして、私のデータベースハンドラクラスのように見ているようなものです

このようなlogcatでエラーが発生します

Failed to open database '/data/user/0/com.newdeveloper.test/databases/xxx'. 
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:835) 
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:820) 
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:723) 
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:692) 
at com.newdeveloper.test.utility.DBHandler.checkDataBase(DBHandler.java:69) 
at com.newdeveloper.test.utility.DBHandler.createDataBase(DBHandler.java:32) 
at com.newdeveloper.test.utility.DAO.<init>(DAO.java:41) 
at com.newdeveloper.test.utility.DAO.getInstance(DAO.java:31) 
at com.newdeveloper.test.activities.SplashScreensActivity.checkForUpdate(SplashScreensActivity.java:111) 
at com.newdeveloper.test.activities.SplashScreensActivity.access$000(SplashScreensActivity.java:41) 
at com.newdeveloper.test.activities.SplashScreensActivity$1.onAnimationEnd(SplashScreensActivity.java:98) 
at android.view.animation.AnimationSet.getTransformation(AnimationSet.java:400) 

しかし、アプリケーションがクラッシュせず、正常に動作しないため、 が必要です。しかし、このエラーは私が のために変更する必要があるものを私に混乱させています。私は最後の2日間から解決しようとしていますが、 はそれのための解決策を見つけませんでした。上級開発者 がこれから出てくるのを助けてくれたら教えてください。ありがとう

+1

https://stackoverflow.com/questions/17034511/android-database-sqlite-sqlitecantopendatabaseexception-unknown-error-code-14 –

+0

@IntelliJAmiya提案ありがとうございます。しかし、私はすでにそれをチェックしており、何の答えも私を解決していません問題。 –

答えて

0

ur apkでバンドルされたデータベースをまだ使用していない場合、ここに問題があります。実際にコード内にデータベースを作成していません。

@Override 
    public void onCreate(SQLiteDatabase db) { 
     //you must create the database here 
    } 

    // ============================================================================== 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //Handle the database update here 
    } 

このような操作が必要です。

@Override 
    public void onCreate(SQLiteDatabase db) { 
     try { 
      db.execSQL(CREATE_STRING); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     Log.e(TAG, "Table Created"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_STRING); 
     onCreate(db); 
     Log.d(TAG, "Table upgraded to Version :" + newVersion); 
    } 

私も使用しているパターンのためにSqliteをのためのより良い抽象化レベルを提供ROOM Androidのアーキテクチャのコンポーネントを、使用を開始するために、Uをお勧めします。

+0

こんにちは!ご回答ありがとうございます。私はバンドルされたデータベースを使用しています。私はそれを質問で書いています。ありがとう –

+0

これは、バンドルされたデータベースのパスにいくつかの違いがあると思われるので、DDMSを使用してパスを取得し、コマンドラインを使用して呼び出すか問題があるかどうかを確認してください。 –

関連する問題