@Override
 public ArrayList<Relation> queryRelation(
     Class class1, Class class2, List<String> key1List, List<String> key2List) {
   acquireReference();
   try {
     SQLStatement stmt = SQLBuilder.buildQueryRelationSql(class1, class2, key1List, key2List);
     final EntityTable table1 = TableManager.getTable(class1);
     final EntityTable table2 = TableManager.getTable(class2);
     final ArrayList<Relation> list = new ArrayList<Relation>();
     Querier.doQuery(
         mHelper.getReadableDatabase(),
         stmt,
         new Querier.CursorParser() {
           @Override
           public void parseEachCursor(SQLiteDatabase db, Cursor c) throws Exception {
             Relation relation = new Relation();
             relation.key1 = c.getString(c.getColumnIndex(table1.name));
             relation.key2 = c.getString(c.getColumnIndex(table2.name));
             list.add(relation);
           }
         });
     return list;
   } finally {
     releaseReference();
   }
 }
 @Override
 public <T> ArrayList<T> queryAll(Class<T> claxx) {
   acquireReference();
   try {
     SQLStatement stmt = new QueryBuilder(claxx).createStatement();
     return stmt.query(mHelper.getReadableDatabase(), claxx);
   } finally {
     releaseReference();
   }
 }
 @Override
 public long queryCount(QueryBuilder qb) {
   acquireReference();
   try {
     SQLiteDatabase db = mHelper.getReadableDatabase();
     SQLStatement stmt = qb.createStatementForCount();
     return stmt.queryForLong(db);
   } catch (Exception e) {
     e.printStackTrace();
   } finally {
     releaseReference();
   }
   return SQLStatement.NONE;
 }
 @Override
 public <T> T queryById(String id, Class<T> claxx) {
   acquireReference();
   try {
     SQLiteDatabase db = mHelper.getReadableDatabase();
     EntityTable table = TableManager.getTable(claxx);
     SQLStatement stmt =
         new QueryBuilder(claxx)
             .where(table.key.column + "=?", new String[] {id})
             .createStatement();
     ArrayList<T> list = stmt.query(db, claxx);
     if (!Checker.isEmpty(list)) {
       return list.get(0);
     }
   } finally {
     releaseReference();
   }
   return null;
 }
 @Override
 public synchronized SQLiteDatabase getReadableDatabase() {
   return mHelper.getReadableDatabase();
 }
 @Override
 public <T> ArrayList<T> query(QueryBuilder qb) {
   SQLiteDatabase db = mHelper.getReadableDatabase();
   // mTableManager.checkOrCreateTable(db, qb.getQueryClass());
   return qb.createStatement().query(db, qb.getQueryClass());
 }