J'ai une classe Java contenant toutes les colonnes d'une table de base de données en tant qu'attributs (variables de membre) et des getters et des setteurs correspondants. P>
Je veux avoir une méthode dans cette classe appelée getcolumncount () code> qui renvoie le nombre de colonnes (c'est-à-dire le nombre d'attributs de la classe)? Comment puis-je implémenter cela sans encadrer le numéro? Je suis ouvert à Critisims à ce sujet en général et des suggestions. Merci. P>
4 Réponses :
Vérifiez le API de réflexion . Si la classe en question est en fait un pure em> javabean, vous pouvez obtenir le nombre de champs (propriétés ou colonnes que vous l'appelez) comme suit: i très question le besoin de cela. Si vous élaborez un peu plus sur l'exigence fonctionnelle pour laquelle vous pensez avoir besoin de cette approche / solution, nous pourrons peut-être suggérer de meilleures façons. P> P>
Merci, cela fonctionne. En ce qui concerne le raisonnement, il s'agit principalement de la journalisation: je dois connaître le nombre de colonnes dans le tableau afin que je puisse garder une trace d'anciennes nouvelles données dans les champs pendant les mises à jour. Le nombre de colonnes est nécessaire afin que les classes de journalisation savent combien de lignes à insérer dans la table de connexion.
Si vous utilisez une API orm décente, vous pouvez utiliser les méthodes fournies par l'API pour comprendre les détails de la cartographie. JPA et Good Ol 'Hibernate peuvent faire cela.
Oui. Malheureusement, le code que je travaille avec n'utilise pas d'API ORM.
OK, vous êtes la bienvenue et bonne chance avec le code. Si vous avez plus de questions, vous savez à nous trouver.
Une approche serait d'utiliser la réflexion pour répertorier les méthodes de la classe et compter les méthodes dont le nom correspond à l'expression régulière " ^ Set. + $ code>". p> ".
Faites une annotation comme "DatabaseColumn", utilisez-le quels champs plantent vers une colonne de table. Vous pouvez utiliser Annotation pour les champs ou les méthodes de getter. Donc, il est sûr pour les champs transitoires pour non utilisés dans la table de base de données.
// in this sample annotation used for getter methods
public int getColumnCount() {
int count = 0;
Method[] methods = getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(DatabaseColumn.class)) {
count++;
}
}
return count;
}
J'avais l'habitude d'avoir le même but que le vôtre, puis a fait une fonction alimentée par la réflexion Java pour résoudre ce problème.
Je peux vous aider. P>
/**
* author: Amo
* to use auto-gen SQL create command to create a table having columns named same as the name of model fields
*/
public void setSQLCreateCmd(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
String fieldName;
Class<?> fieldType;
int fieldCount = fields.length;
Log.d("[DEBUG]", "... fieldCount:" + fieldCount);
int i = 0;
DATABASE_CMD = "create table if not exists " + DATABASE_NAME +
"(" +
"_id integer primary key autoincrement, ";
for (Field field : fields) {
if (!field.isAccessible()) field.setAccessible(true);
fieldName = field.getName();
fieldType = field.getType();
if (fieldName.compareTo("") == 0) {
Logger.d("!!! field name is empty");
continue;
}
if (i == fieldCount - 1) {
Logger.d("... field at " + (i+1) + "named " + fieldName);
if (fieldType.equals(String.class)) DATABASE_CMD += fieldName + " text" + ")";
else if (fieldType.equals(int.class) || fieldType.equals(Integer.class)) DATABASE_CMD += fieldName + " integer" + ")";
} else {
Logger.d("... field at " + (i+1) + "named " + fieldName);
if (fieldType.equals(String.class)) DATABASE_CMD += fieldName + " text" + ",";
else if (fieldType.equals(int.class) || fieldType.equals(Integer.class)) DATABASE_CMD += fieldName + " integer" + ",";
}
i++;
}
/**
* fixes fieldCount is not as same as the defined
*/
StringBuilder stringBuilder = new StringBuilder(DATABASE_CMD);
stringBuilder.setCharAt(stringBuilder.lastIndexOf(","), ')');
DATABASE_CMD = stringBuilder.toString();
Log.d("[DEBUG]", "... now sql cmd is " + DATABASE_CMD);
Logger.d("... now sql cmd is " + DATABASE_CMD);
}
Vous pouvez probablement le faire avec une réflexion, mais pourquoi avez-vous besoin de savoir ce numéro? J'ai le sentiment qu'il peut y avoir une meilleure façon de faire ce que vous essayez de faire.