2016-11-21 1 views
0

J'utilise le framework ORMLite sur un projet android et je suis bloqué en utilisant OpenHelperManager.getHelper() sur plusieurs classes repo.OpenHelperManager: - Définition de la nouvelle classe d'assistance lors de l'utilisation de plusieurs classes auxiliaires dans OpenHelperManager ORMLite android

Voici un bref de ma structure de code: -

DatabaseHelper classe qui est responsable de la création et databasetables

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{ 

    public static String DATABASE_NAME = "muffet.db"; 
    public static int DATABASE_VERSION = 5; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { 
     // Creating tables 
     try { 
      TableUtils.createTable(connectionSource, Category.class); 
      TableUtils.createTable(connectionSource, Transaction.class); 
      TableUtils.createTable(connectionSource, Budget.class); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { 
     try { 
      TableUtils.dropTable(connectionSource, Category.class, true); 
      TableUtils.dropTable(connectionSource, Transaction.class, true); 
      TableUtils.dropTable(connectionSource, Budget.class, true); 
      onCreate(database, connectionSource); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

TransactionRepo qui est responsable de la base de données accès.

public class TransactionRepo extends DatabaseHelper { 
    // private Dao<Transaction, Integer> transactionDao = null; 
    private RuntimeExceptionDao<Transaction, Integer> transactionRuntimeDao = null; 

    public TransactionRepo(Context context) { 
     super(context); 
    } 

    public RuntimeExceptionDao<Transaction, Integer> getTransactionRuntimeDao(){ 
     if(transactionRuntimeDao == null){ 
      transactionRuntimeDao = getRuntimeExceptionDao(Transaction.class); 
     } 
     return transactionRuntimeDao; 
    } 

    /** 
    * Save Transaction to database 
    */ 
    public void save(Transaction transaction){ 
     try { 
      transactionRuntimeDao = getTransactionRuntimeDao(); 
      transactionRuntimeDao.createOrUpdate(transaction); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    /** 
    * Get all list of data 
    */ 
    public List<Transaction> getAll(){ 
     try{ 
      transactionRuntimeDao = getTransactionRuntimeDao(); 
      return transactionRuntimeDao.queryForAll(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

TransactionServiceImpl qui est une classe de service pour obtenir des données de la TransactionRepo

public class TransactionServiceImpl implements TransactionService { 

    TransactionRepo transactionRepo; 

    @Override 
    public void save(Transaction transaction, Activity activity) { 


     transactionRepo = OpenHelperManager.getHelper(activity, TransactionRepo.class); 
     transactionRepo.save(transaction); 
     OpenHelperManager.releaseHelper(); 
    } 

    @Override 
    public List<Transaction> getAll(Activity activity) { 

     transactionRepo = OpenHelperManager.getHelper(activity, TransactionRepo.class); 

     List<Transaction> transactionList = transactionRepo.getAll(); 

     OpenHelperManager.releaseHelper(); 

     return transactionList; 
    } 
} 

Il fonctionne très bien quand je le lance. Mais quand je tente d'accéder à une autre repository classe qui étend DatabaseHelper, et utiliser le OpenHelperManager.getHelper() comme par exemple: -

CategoryRepo categoryRepo = OpenHelperManager.getHelper(activity, CategoryRepo.class); 

Je reçois erreur java.lang.IllegalStateException: Helper class was class com.muffet.persistence.repository.TransactionRepo but is trying to be reset to class com.muffet.persistence.repository.CategoryRepo

Cela signifie clairement que le OpenHelperManager a sauvé instance de TransactionRepo et quand j'essaie de l'obtenir et de le définir comme CategoryRepo il est incapable de lancer ou quelque chose comme ça.

Comment puis-je résoudre ce problème?

Merci

+0

est-ce pas ce qu'il ya quelqu'un qui peut répondre à la question? Ca fait des jours et je suis toujours coincé – viper

Répondre

1
public static synchronized void releaseHelper() { 
    instanceCount--; 
    logger.trace("releasing helper {}, instance count = {}", helper, instanceCount); 
    if (instanceCount <= 0) { 
     if (helper != null) { 
      logger.trace("zero instances, closing helper {}", helper); 
      helper.close(); 
      helper = null; 
      wasClosed = true; 
     } 
     if (instanceCount < 0) { 
      logger.error("too many calls to release helper, instance count = {}", instanceCount); 
     } 
    } 
} 

La méthode releasetHelper ne pas réinitialiser helperClass menber statique:

private static Class<? extends OrmLiteSqliteOpenHelper> helperClass = null; 

Alors, quand vous voulez getHelper d'une autre classe, comme ci-dessous dit:

private static void innerSetHelperClass(Class<? extends OrmLiteSqliteOpenHelper> openHelperClass) { 
    // make sure if that there are not 2 helper classes in an application 
    if (openHelperClass == null) { 
     throw new IllegalStateException("Helper class was trying to be reset to null"); 
    } else if (helperClass == null) { 
     helperClass = openHelperClass; 
    } else if (helperClass != openHelperClass) { 
     throw new IllegalStateException("Helper class was " + helperClass + " but is trying to be reset to " 
       + openHelperClass); 
    } 
} 

Ainsi, même votre classe d'assistance précédente ('helperClass') est parent de votre classe d'assistance ultérieure ('ope nHelperClass '), mais toujours pas égal. C'est la raison de l'exception que vous avez vue.

Ma suggestion est d'appeler

OpenHelperManager.setOpenHelperClass(CategoryRepo.class);

avant

CategoryRepo categoryRepo = OpenHelperManager.getHelper(activity, CategoryRepo.class);