2

SOとGoogleで検索しましたが、私の場合には合わないようです。私のアプリケーションは、複数のユーザー ログからランダムにこの例外を受け取ります。これは、エミュレーターまたはデバイスでテストしている間は発生しません (Galaxy tab2 10.1、Android OS 4.1.1 で実行しています)。 development.必要な Android マニフェストのアクセス許可が用意されています。以下は私のコードとスタックトレースです

スタックトレース :

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) 
android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)                   
android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:678)                     
android.database.sqlite.SQLiteSession.beginTransactionUnchecked(SQLiteSession.java:323)                     
android.database.sqlite.SQLiteSession.beginTransaction(SQLiteSession.java:298)                      
android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:505)                        
android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:416)                        
com.framework.dataaccess.GenericDAO.start(GenericDAO.java:78)       

以下は、SQLitedatabase をインスタンス化する私のシングルトンです

protected static GenericDAO getInstance(Context ctx, String sql) {

  if (instance == null) {
            try {
                instance = new GenericDAO(ctx, sql);
            } 
            catch (Exception e) { e.printStackTrace(); }
        }

        if(db == null || !db.isOpen()){
            try {
                db = instance.getWritableDatabase();

            } 
         catch (Exception e) { e.printStackTrace(); }   

        }

        return instance;
 }

挿入、削除、または更新操作の場合、これらの start() および commit() を挿入します。

public void start() throws Exception{
        try{
            db.beginTransaction();
        }catch(Exception e){ 
            e.printStackTrace();
            throw e;
        }
    }

public void commit()  throws Exception{
    try{
        db.setTransactionSuccessful();
    }
    catch(Exception e){ 
        e.printStackTrace();
        throw e;
    }
    finally{
      db.endTransaction();      
    }

}


  public Cursor select(String table, String[] columns, String criteriaColValue){
     return db.query(true, table, columns, criteriaColValue, null, null, null, null, null); 
    }

私のコードは、以下の dao select から例外をスローします。これは「start()」メソッドを呼び出しません。

 public  ArrayList<Obj> getObjList(){


           ChildDao dao                = null;
           Cursor cursor               = null;
           ArrayList<Obj> list = new  ArrayList<Obj>();

            try{
                 dao = new childDao(context);
                 cursor = dao.select(TABLE_NAME, columns, Criterea );   

                 if(cursor!=null && cursor.moveToFirst()){
                    do{
                      list.add(myObjs);
                    } while(cursor.moveToNext());
                 }

            }catch(Exception ex){
                ex.printStackTrace();

            }
            finally{
                if(cursor!=null)cursor.close();
             }
          return list;
         }

エラーがどのように発生したのか、開発環境から再現できないのかわかりません。どこを調べればよいか教えてもらえますか?前もって感謝します。

4

1 に答える 1

1

これは少し遅いかもしれませんが、これがこの問題を抱えている人に手がかりを与えることを願っています. 同様の再現が難しい例外もありました。

unable to open database file (code 14)
    android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:845)

データベースが原因ではない可能性がありますが、アプリケーションのどこかに余分なデータ/ファイルの割り当てが関係しています。私の場合、それは悪い SoundPool コードでした。詳細は次のとおりです。

java.lang.RuntimeException: パーセルから入力チャネル ファイル記述子を読み取れませんでした

于 2015-01-07T05:31:58.010 に答える