Mon application Android ayant plusieurs activités, mon problème est maintenant impossible à trouver.

Une activité a un recycleur Visualisez qu'elle récupère les données de la base de données locale, si je clique sur les éléments, elle ouvrira l'activité B, ce même flux en continu, puis l'application se bloquant (comme ouvrir l'activité B, revenir à l'activité A et ouvrir à nouveau l'activité B - jusqu'à 5 à 6 fois faire la même action puis l'application se bloque)

Le message d'erreur est lié à SQLite DATABASE mais ne parvient pas à trouver où il se produit. S'il vous plaît, aidez-moi ... passez déjà plus de temps pour cela ...

Remarque: ouvrir DB sur Oncreate et Fermer DB sur OnDestroy dans les deux activités

Message d'erreur

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
Raja 15 nov. 2017 à 07:55

3 réponses

Cette erreur se produit généralement lorsque vous oubliez de fermer la base de données. essayez de fermer le curseur et la base de données après la transaction.

0
Raj 15 nov. 2017 à 06:04

Essayez d'utiliser le modèle Singleton et accédez à l'aide de db = DatabaseHelper.getInstance (context). Cela garantit qu'un seul assistant de base de données existera tout au long du cycle de vie de l'application.

 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);
     }
  }
1
Jayshree 15 nov. 2017 à 05:31

Chaque fois que nous accédons à la base de données ou la mettons à jour, nous devrions avoir à ouvrir et fermer la base de données une fois l'opération effectuée. regarde.

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(); 

Voici getAllItems() qui retournera des articles.

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

Donc dans votre cas, lorsque vous cliquez sur un élément de la liste, vous devez ouvrir / fermer la base de données avec soin.

Bon codage !!

1
Hemant Parmar 15 nov. 2017 à 05:05
47299613