Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
This repository was archived by the owner on Feb 26, 2023. It is now read-only.

Suggestion for @OrmLiteDao #588

Description

@gebing

Using @OrmLiteDao, androidannotations will generate code like this:

connectionSource_ = OpenHelperManager.getHelper(this, DatabaseHelper.class).getConnectionSource();
try {
    clickGroupDao = DaoManager.createDao(connectionSource_, ClickGroup.class);
} catch (SQLException e) {
    Log.e("MyActivity_", "Could not create DAO", e);
}

I suggest user DatabaseHelper.getDao(clazz) instead of DaoManager.createDao(), because user can do some extra work to override function DatabaseHelper.getDao()

Activity

  1. DayS commented on May 17, 2013

    @DayS
    Contributor

    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

  2. gebing commented on May 18, 2013

    @gebing
    ContributorAuthor

    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;
    }

  3. gebing commented on May 18, 2013

    @gebing
    ContributorAuthor

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

  4. mathieuboniface commented on May 18, 2013

    @mathieuboniface
    Contributor

    Please provide a pull request. We can't see your changes.

  5. gebing commented on May 18, 2013

    @gebing
    ContributorAuthor

    Should i make a pull request for master branch (v2.7.1) or develop branch (v3,0beta)?

  6. mathieuboniface commented on May 18, 2013

    @mathieuboniface
    Contributor

    The best way to go is to create a new branch based on develop.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions