2011-04-24 3 views
0

J'ai un problème en utilisant le framework ORMlite avec plusieurs tables/classes.Android ORMlite - plusieurs tables/classes

obtenu un DatabaseHelper.class Ive qui prolonge la Wich OrmLiteSqliteOpenHelper ressemble à ceci (pièces importantes):

public class DatabaseHelper<T> extends OrmLiteSqliteOpenHelper { 

    private static final String DATABASE_NAME = "database.db"; 
    private static final int DATABASE_VERSION = 6; 

    private Dao<T, Integer> myDao = null; 
    private Class<T> type; 

    public DatabaseHelper(Context context, Class<T> type) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.type = type; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { 
     try { 
      TableUtils.createTable(connectionSource, type); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public Dao<T, Integer> getmyDataDao() throws SQLException { 
     if (myDao == null) { 
      myDao = getDao(type); 
     } 
     return myDao; 
    } 
} 

J'utilise 2 classes (Admin1, Admin2) où je veux sauver 2 objets différents (Object1, Object2) dans la base de données. Voici le code que j'ai utilisé pour cela.

Amin1:

static { 
    OpenHelperManager.setOpenHelperFactory(new SqliteOpenHelperFactory() { 
     public OrmLiteSqliteOpenHelper getHelper(Context context) { 
      return new DatabaseHelper<Object1>(context, Object1.class); 
     } 
    }); 
} 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.object1); 
    Dao<Object1, Integer> myDaoObject1 = getHelper().getmyDataDao(); 
    Object1 o1 = new Object1("Name of Object 1"); 
    int ret = myDaoObject1.create(o1); 
} 

Admin2:

static { 
    OpenHelperManager.setOpenHelperFactory(new SqliteOpenHelperFactory() { 
     public OrmLiteSqliteOpenHelper getHelper(Context context) { 
      return new DatabaseHelper<Object2>(context, Object2.class); 
     } 
    }); 
} 


protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.object2); 
    Dao<Object2, Integer> myDaoObject2 = getHelper().getmyDataDao(); 
    Object2 o2 = new Object2("Name of Object 2"); 
    int ret = myDaoObject2.create(o2); 
} 

Il fonctionne très bien pour le premier objet i sauver (en Admin1 ou Admin2). Mais si je sauvegarde object1 dans Admin1 et après que je veux enregistrer object2 dans Admin2 ou inverse (l'ordre n'est pas décisif), j'obtiens erreur suivante dans la ligne "int ret = myDaoObject2.create (o2);":

Unable to run stmt on object [email protected]: INSERT INTO `object2` (`name`) VALUES (?) 

Il n'y a pas d'erreur lors de la création de Object2 o2 dans le code. Pas plus que la ligne "int ret = myDaoObject2.create (o2);" l'erreur se produit ... Je ne sais pas pourquoi il y a un "?" dans la valeur. Une ligne avant l'objet semble bien.

Quelqu'un a-t-il une idée?

Merci beaucoup!

Mise à jour

Malheureusement, je ne pouvais pas résoudre le problème.

essayé maintenant Ive fermer la OrmLiteSqliteOpenHelper au onPause() et/ou au onStop() du activitiy:

myHelper.close(); 

Depuis que je reçois l'erreur "Unable to destroy activity - null pointer exception".

Je ne peux pas comprendre cette erreur :-(

Est-ce que quelqu'un a une idée?

+0

S'il vous plaît simplement modifier votre question de fournir des informations supplémentaires ou utiliser les installations de commentaires dans les réponses individuelles à demander des éclaircissements. –

Répondre

3

est-ce pas votre fichier DB complètement réécrite sur admin2 initialisation? Avez-vous vraiment besoin de deux instances différentes Helper? Si vous juste besoin d'avoir deux objets différents dao pour eux - utiliser un assistant partagé et il suffit d'ajouter une nouvelle méthode getAdmin2Dao

HTH

EDIT (Ajout d'un code):

.
+0

Je ne suis pas sûr si j'ai besoin de 2 instances auxiliaires différentes. J'ai juste besoin d'obtenir des données (objets) à partir de différentes tables de la base de données dans différentes actions ... Malheureusement, je ne connais pas la meilleure pratique. Pouvez-vous me donner plus de détails ou un exemple de code de votre indice s'il vous plaît? thnx! – SKAf8ce

+0

Ajouté du code pour clarifier, je l'espère. –

+0

c'était utile. ma première intention était de résoudre ce problème avec des génériques, mais c'est ok aussi je pense! Je l'utiliserai! Je vous remercie! ;) – SKAf8ce

-1

J'ai eu cette erreur il y a 2 jours et je viens de résoudre cette nuit :) Lorsque vous créez votre premier objet, ou etc. Vous obtenez une erreur car l'assistant de base de données ne crée pas de second objet (TAble).Tout d'abord, lorsque vous ouvrez votre application, vous devez créer vos objets (classes de table) comme ci-dessous

TableUtils.createTable(helper.getConnectionSource(), BudgetCategory.class); 
.... 
....