	/**
	 * レコード検索処理
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param sql
	 *            SQL文。パラメータ部分は"?"のように記述する。
	 * @param args
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @return エンティティのリスト
	 */
	public List<$data.srcClassName> rawQuery(
			SQLiteDatabase db, String sql, String[] args) {
		List<$data.srcClassName> result =
				new ArrayList<$data.srcClassName>();
		Cursor cursor = null;
		try {
			cursor = db.rawQuery(sql, args);
			while (cursor.moveToNext()) {
				result.add(getEntityFromCursor(cursor));
			}
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return result;
	}

	/**
	 * SQL実行
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @param sql
	 *            SQL文。
	 */
	public void execSQL(SQLiteDatabase db, String sql) {
		db.execSQL(sql);
	}

	/**
	 * SQL実行
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @param sql
	 *            SQL文。パラメータ部分は"?"のように記述する。
	 * @param args
	 *            検索条件のパラメータ配列。不要な場合null。
	 */
	public void execSQL(SQLiteDatabase db, String sql, Object[] bindArgs) {
		db.execSQL(sql, bindArgs);
	}

	/**
	 * レコード検索処理
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @param groupBy
	 *            未指定の場合null。
	 * @param having
	 *            未指定の場合null。
	 * @param orderBy
	 *            ソート条件。未指定の場合null。
	 * @param limit
	 *            取得件数。未指定の場合null。指定するとパフォーマンスアップ。
	 * @return エンティティのリスト
	 */
	public List<$data.srcClassName> query(SQLiteDatabase db,
			String selection, String[] selectionArgs, String groupBy, String having,
			String orderBy, String limit) {
		List<$data.srcClassName> result =
			new ArrayList<$data.srcClassName>();
		Cursor cursor = null;
		try {
			cursor = db.query("$data.tableName",
				getColumnNames(),
				selection, selectionArgs, groupBy, having, orderBy, limit);
			while (cursor.moveToNext()) {
				result.add(getEntityFromCursor(cursor));
			}
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return result;
	}

	/**
	 * レコード検索処理（簡易版）
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @param orderBy
	 *            ソート条件。未指定の場合null。
	 * @param limit
	 *            取得件数。未指定の場合null。指定するとパフォーマンスアップ。
	 * @return エンティティのリスト
	 */
	public List<$data.srcClassName> query(SQLiteDatabase db,
			String where, String[] whereArgs, String orderBy, String limit) {
		return query(db, where, whereArgs, null, null, orderBy, limit);
	}

	/**
	 * レコード検索処理（全件）
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param limit
	 *            取得件数。未指定の場合null。指定するとパフォーマンスアップ。
	 * @return エンティティのリスト
	 */
	public List<$data.srcClassName> query(SQLiteDatabase db, String limit) {
		return query(db, null, null, null, null, "${data.idField.dbName}", limit);
	}

	/**
	 * 1レコード検索処理
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @param groupBy
	 *            未指定の場合null。
	 * @param having
	 *            未指定の場合null。
	 * @param orderBy
	 *            ソート条件。未指定の場合null。指定するとパフォーマンスアップ。
	 * @return エンティティ
	 */
	public $data.srcClassName querySingle(SQLiteDatabase db,
			String where, String[] whereArgs, String groupBy, String having, String orderBy) {
		List<$data.srcClassName> list =
			query(db, where, whereArgs, groupBy, having, orderBy, "1");
		if (list.size() == 0) {
			return null;
		} else {
			return list.get(0);
		}
	}

	/**
	 * 1レコード検索処理（簡易版）
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @param orderBy
	 *            ソート条件。未指定の場合null。
	 * @return エンティティ
	 */
	public $data.srcClassName querySingle(SQLiteDatabase db,
			String where, String[] whereArgs, String orderBy) {
		return querySingle(db, where, whereArgs, null, null, orderBy);
	}

	/**
	 * レコード件数取得処理
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @param groupBy
	 *            未指定の場合null。
	 * @param having
	 *            未指定の場合null。
	 * @return 件数
	 */
	public int queryCount(SQLiteDatabase db,
			String where, String[] whereArgs, String groupBy, String having) {
		int count = 0;
		Cursor cursor = null;
		try {
			cursor = db.query("$data.tableName",
					new String[]{"count($data.idField.dbName)"},
					where, whereArgs, groupBy, having, null, "1");
			if (cursor.moveToFirst()) {
				count = cursor.getInt(0);
			}
		} finally {
			if (cursor != null) {
				cursor.close();
			}
		}
		return count;
	}

	/**
	 * レコード件数取得処理（簡易版）
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @param where
	 *            検索条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            検索条件のパラメータ配列。不要な場合null。
	 * @return 件数
	 */
	public int queryCount(SQLiteDatabase db, String where, String[] whereArgs) {
		return queryCount(db, where, whereArgs, null, null);
	}

	/**
	 * レコード件数取得処理（全件）
	 *
	 * @param db
	 *            DB接続（書き込み権限不要）
	 * @return 件数
	 */
	public int queryCount(SQLiteDatabase db) {
		return queryCount(db, null, null, null, null);
	}

	/**
	 * レコード追加
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @return ID
	 */
	public long insert(SQLiteDatabase db, $data.srcClassName entity) {
		ContentValues values = getContentValuesForInsert(entity);
		long id = db.insert("$data.tableName", null, values);
		return id;
	}

	/**
	 * レコード更新
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @return 件数
	 */
	public int update(SQLiteDatabase db, $data.srcClassName entity) {
		int count = db.update(
			"$data.tableName",
			getContentValuesForUpdate(entity),
			"${data.idField.dbName}=" + entity.get${data.idField.srcName}(),
			null);
		return count;
	}

	/**
	 * レコード削除
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @param where
	 *            削除条件。パラメータ部分は"?"のように記述する。nullの場合、条件なし。
	 * @param whereArgs
	 *            削除条件のパラメータ配列。不要な場合null。
	 * @return 件数
	 */
	public int delete(SQLiteDatabase db, String where, String[] whereArgs) {
		return db.delete("$data.tableName", where, whereArgs);
	}

	/**
	 * レコード削除
	 *
	 * @param db
	 *            書き込み権限付きDB接続
	 * @return 件数
	 */
	public int delete(SQLiteDatabase db, $data.srcClassName entity) {
		return delete(db, "${data.idField.dbName}=" + entity.get${data.idField.srcName}(), null);
	}

	/**
	 * カラム名を取得する
	 */
	public String[] getColumnNames() {
		return new String[] {
#foreach ($field in $data.fieldList)
				"$field.dbName",
#end
			};
	}

	/**
	 * カラム名を取得する（JOIN用）
	 */
	public String getColumnNamesForJoin() {
		return ""
#set($sep = "")
#foreach ($field in $data.fieldList)
			+ "${sep}${data.tableName}.${field.dbName} as ${field.dbName}"
#set($sep = ",")
#end
			;
	}
