0

私のAndroidアプリは複数のアクティビティを持つので、今問題を見つけることができません。アプリ連続して開いている間にクラッシュする閉じる2つのアクティビティ間のアクティビティ

アクティビティが1つあります。ローカルデータベースからデータを取得します。アイテムをクリックすると、Bアクティビティが開き、同じフローが継続してクラッシュします(開いているBアクティビティがAアクティビティに戻り、 - 最大5〜6時間が同じ動作をしてからアプリがクラッシュする)

クラッシュメッセージはSQLite DATABASEに関連していますが、どこから発生するのかを見つけることができません。 ...このために多くの時間を費やすすでに...私を助けてください

注:OnDestroy上のOnCreateして閉じるDB上のオープンDBの両方の活動で

エラーメッセージ

E/SQLiteQuery: exception: unable to open database file (code 14); query: SELECT DISTINCT * FROM parameters WHERE inspection_no LIKE '%TEST-123%' 
E/InputChannel-JNI: Error 24 dup channel fd 1023. 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.testapp.testprocess, PID: 13078 
        java.lang.RuntimeException: Could not read input channel file descriptors from parcel. 
         at android.view.InputChannel.nativeReadFromParcel(Native Method) 
         at android.view.InputChannel.readFromParcel(InputChannel.java:148) 
         at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:841) 
         at android.view.ViewRootImpl.setView(ViewRootImpl.java:640) 
         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342) 
         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94) 
         at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3518) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2733) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6121) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 
+0

私はあなたがタスクを完了した後dbオブジェクトを閉じることを忘れないと思う。 –

+0

@AdarshAshok、いいえ、OncreateのDBを開き、両方のアクティビティでOnDestroyのDBを閉じる – Raja

+0

タスクを完了した後にdbを閉じてください...問題が解決する可能性があります。 –

答えて

0

私は次の手順で問題を解決しました。

  1. 私はシングルトンデータベースを作成しました。データベースオブジェクトが1回だけ作成されるようにしました。
  2. データベースを照会した後にカーソルオブジェクトを閉じる。 (私が逃した)
  3. アクティビティのonStop()でデータベースを閉じます。 (私は(onDestroyを読んで)、それは確かに呼び出されることはありません、安全ではない)タイムリーな助けをすべてに

感謝:)

1

データベースにアクセスまたは更新するたびに、操作を実行した後でデータベースを開いたり閉じたりする必要があります。見てください。

DataBaseHelper db = new DataBaseHelper(this); 
db.open(); 
Cursor cursor = db.getAllItems(); 
maxCount = cursor.getCount(); 
Random gen = new Random(); 
row = gen.nextInt(maxCount); 
if (cursor.moveToPosition(row)) { 
    String myString = cursor.getString(1); 
} 
cursor.close(); 
db.close(); 

ここにはgetAllItems()が返されます。

public Cursor getAllItems() 
{ 
return db.query(DATABASE_TABLE, new String[] { 
     KEY_ROWID, 
     KEY_NAME 
     }, 
     null, 
     null, 
     null, 
     null, 
     null); 
} 

あなたのケースでは、リスト項目をクリックすると、データベースを慎重に開閉する必要があります。

ハッピーコーディング!

1

シングルトンパターンを使用し、db = DatabaseHelper.getInstance(context)を使用してアクセスしてください。アプリケーションライフサイクル全体で1つのデータベースヘルパーしか存在しません。

public class DatabaseHelper extends SQLiteOpenHelper { 

private static DatabaseHelper sInstance; 

private static final String DATABASE_NAME = "database_name"; 
private static final String DATABASE_TABLE = "table_name"; 
private static final int DATABASE_VERSION = 1; 

public static synchronized DatabaseHelper getInstance(Context context) { 

    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context. 
    if (sInstance == null) { 
    sInstance = new DatabaseHelper(context.getApplicationContext()); 
    } 
    return sInstance; 
    } 

    /** 
    * Constructor should be private to prevent direct instantiation. 
    * make call to static method "getInstance()" instead. 
    */ 
    private DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    } 
0

あなたが閉じるのを忘れたときにこのエラーは通常発生しますデータベース。 トランザクションの後でカーソルとデータベースを閉じてみます。

関連する問題