Repository navigation
Suggestion for @OrmLiteDao #588
Description
Activity
The implementation of OrmLiteSqliteOpenHelper.getDao(clazz) is (currently) the following :
public <D extends Dao<T, ?>, T> D getDao(Class<T> clazz) throws SQLException { // special reflection fu is now handled internally by create dao calling the database type Dao<T, ?> dao = DaoManager.createDao(getConnectionSource(), clazz); @SuppressWarnings("unchecked") D castDao = (D) dao; return castDao; }
So, it works for me. We shouldn't break the API with this. Go ahead and make a PR if you want :)
Note: I updated you post to improve readability
This is my implementation of OrmLiteSqliteOpenHelper.getDao(clazz), which will create table if not exist. It is a good solution when we do not know all sqlite tables in advance.
public <D extends Dao<T, ?>, T> D getDao(Class clazz) throws SQLException
{
D dao = super.getDao(clazz);
TableUtils.createTableIfNotExists(dao.getConnectionSource(), clazz);
return dao;
}This is my modification for OrmLiteDaoProcessor.java of version 2.7.1:
package com.googlecode.androidannotations.processing;
import com.googlecode.androidannotations.annotations.OrmLiteDao;
import com.googlecode.androidannotations.helper.TargetAnnotationHelper;
import com.googlecode.androidannotations.processing.EBeansHolder.Classes;import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JVar;
import com.sun.codemodel.JTryBlock;
import com.sun.codemodel.JCatchBlock;import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.type.TypeMirror;public class OrmLiteDaoProcessor implements DecoratingElementProcessor {
private static final String DATABASE_HELPER_FIELD_NAME = "helper_"; private TargetAnnotationHelper helper; public OrmLiteDaoProcessor(ProcessingEnvironment processingEnv) { helper = new TargetAnnotationHelper(processingEnv, getTarget()); } @Override public Class<? extends Annotation> getTarget() { return OrmLiteDao.class; } @Override public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { Classes classes = holder.classes(); String fieldName = element.getSimpleName().toString(); TypeMirror modelObjectTypeMirror = helper.extractAnnotationParameter(element, "model"); TypeMirror databaseHelperTypeMirror = helper.extractAnnotationParameter(element, "helper"); // database helper field boolean databaseHelperInjected = holder.generatedClass.fields().containsKey(DATABASE_HELPER_FIELD_NAME); JBlock initBody = holder.init.body(); JFieldVar databaseHelperRef; if (databaseHelperInjected) { databaseHelperRef = holder.generatedClass.fields().get(DATABASE_HELPER_FIELD_NAME); } else { databaseHelperRef = holder.generatedClass.field(JMod.PRIVATE, holder.refClass(databaseHelperTypeMirror.toString()), DATABASE_HELPER_FIELD_NAME); // get database helper instance JExpression databaseHelperClass = holder.refClass(databaseHelperTypeMirror.toString()).dotclass(); initBody.assign(databaseHelperRef, // classes.OPEN_HELPER_MANAGER // .staticInvoke("getHelper") // .arg(holder.contextRef) // .arg(databaseHelperClass)); } // create dao from database helper JTryBlock tryBlock = initBody._try(); JExpression modelClass = holder.refClass(modelObjectTypeMirror.toString()).dotclass(); tryBlock.body().assign(JExpr.ref(fieldName), databaseHelperRef.invoke("getDao").arg(modelClass)); JCatchBlock catchBlock = tryBlock._catch(classes.SQL_EXCEPTION); JVar exception = catchBlock.param("e"); catchBlock.body() // .staticInvoke(classes.LOG, "e") // .arg(holder.generatedClass.name()) // .arg("Ormlite could not create " + fieldName) // .arg(exception); }}
And generate code is look like:
helper_ = OpenHelperManager.getHelper(this, DatabaseHelper.class);
try {
clickGroupDao = helper_.getDao(ClickGroup.class);
} catch (SQLException e) {
Log.e("MyActivity_", "Ormlite could not create clickGroupDao", e);
}Please provide a pull request. We can't see your changes.
Should i make a pull request for master branch (v2.7.1) or develop branch (v3,0beta)?
The best way to go is to create a new branch based on develop.
Using @OrmLiteDao, androidannotations will generate code like this:
I suggest user
DatabaseHelper.getDao(clazz)instead ofDaoManager.createDao(), because user can do some extra work to override functionDatabaseHelper.getDao()