annotation在android上进行数据操作

在android做数据操作,的确是一件赏心悦目的事情……
今天总结一下java中annotation应用于android平台的方法。下面以一个demo来说明这像技术。
首先,在java api中看到关于annotation的一个description:
The common interface extended by all annotation types. Note that an interface that manually extends this one does not define an annotation type. Also note that this interface does not itself define an annotation type.
大概就是说:他所有
注释类型的通用接口,手动扩展这个接口时注意这个接口没有注释类型。还有就是这个接口并不定义一个注释类型。
通过api,还可以知道,Annotation(注释)是J2SE 5.0引入的新功能,它被定义为JSR-175规范。简单地说,它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。很多文章介绍注释的基本概念,以及Java内置注释(@Override、@Deprecated)的使用方法;下面说一下如何定制注释。
运行截图:

 

图片

 

其运行质量不亚于其他任何方法。。
所以,我们需要手动创造一个扩展类,且自定义注释类型。
可以这样写:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBField {
}
这样一个注释类型就ok啦!
然后,在been类中,即模型对象类里使用注释DBField:

public class Place {
@DBField(primarykey = true, notNull = true)
public String _uid;
@DBField(filedName = "name")
public String _name;
}
按照这样的方法就可以得到强大的been了。
下面给出一个dbmanerger,该类实现了反射和anntation 结合:
package cn.lpm.controler;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

import cn.lpm.been.Place;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper{
public final static String _DB_NAME             = "places.db";
public final static String _T_PLACE_TBL         = "t_place";
public final static String _DEFAULT_FIELD_NAME   = "##default";
public DBHelper(Context context) {
super(context, _DB_NAME, null, 2);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0) {
createTbl(arg0, _T_PLACE_TBL, Place.class);
System.out.println(this._T_PLACE_TBL +"has been crteated!");
System.out.println(this._DB_NAME +"has been crteated!");
}
/*
 * 继承sqliteopenhelper,自动执行的方法
 * (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
 */
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
/*
 * 创建表
 */
private void createTbl(SQLiteDatabase db, String tblName, Class<?> clazz) {
StringBuilder sql = new StringBuilder();
sql.append("CREATE TABLE ");
sql.append(tblName);
sql.append(" (");
//
boolean first_field = true;
for( Field f : clazz.getFields()) {
if(f.isAnnotationPresent(DBField.class)) {
if(!first_field) {
sql.append(", ");
}
DBField annotation = f.getAnnotation(DBField.class); //拿到自定义的anotation类
String fieldName = annotation.filedName(); //拿到该定义的一个标识
if(fieldName.equals(_DEFAULT_FIELD_NAME)) { //拿到注释类重定义的标识名与下面的clazzToDbTypeString(f.getType())相反
fieldName = f.getName(); //一下依次……
}
sql.append(fieldName);
sql.append(' ');
sql.append(clazzToDbTypeString(f.getType())); 如果被anotation标识的been中注释为缺省的,就拿到定义类型
if(annotation.primarykey()) {
sql.append(" PRIMARY KEY");
}
if(annotation.notNull()) {
sql.append(" NOT NULL");
}
first_field = false;
}
}
sql.append(");");
System.out.println(sql.toString());
db.execSQL(sql.toString());
}
/*
 * 获取相应字段的类型(java反射的原理)
 */
private String clazzToDbTypeString(Class<?> clazz) {
if( clazz == String.class 
|| clazz == Character.class || clazz == char.class 
|| clazz == Boolean.class || clazz == boolean.class) {
return "TEXT";
}else if(clazz == Integer.class || clazz == int.class 
|| clazz == Long.class || clazz == long.class
|| clazz == Short.class || clazz == short.class) {
return "INTEGER";
}else if(clazz == Float.class || clazz == float.class || clazz == Double.class || clazz == double.class) {
return "REAL";
}else {
return "BLOB";
}
}
/*
 * 以对象为单位插入表
 */
public boolean insert( String tblName, Object object ) {
ContentValues v = new ContentValues();
for( Field f : object.getClass().getFields() ) {
if(f.isAnnotationPresent(DBField.class)) {
DBField annotation = f.getAnnotation(DBField.class); //通过anotation(注释)的方法得到字段名,如果没有用到anotation定义,则使用缺省值
String fieldName = annotation.filedName();
if(fieldName.equals(_DEFAULT_FIELD_NAME)) {
fieldName = f.getName();
}
try {
v.put(fieldName, f.get(object).toString());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (NullPointerException e) {
System .out.println("NullPointerException!");
}
}
}
SQLiteDatabase db = getWritableDatabase();
if( db.insert(tblName, null, v) == -1 ) {
db.close();
return false;
}
db.close();
return true;
}
public boolean delete(String tblName, Object object) {
return false;
}
/*
 * 根据游标位置来获取对象
 */
public Object cursorToObject(Cursor cursor, Class<?> clazz) throws Exception {
Constructor<?> ct = clazz.getConstructor((Class[])null);
Object sg = ct.newInstance((Object[])null);
for( Field f : clazz.getFields() ) {
if(f.isAnnotationPresent(DBField.class)) {
DBField annotation = f.getAnnotation(DBField.class);
String fieldName = annotation.filedName();
if(fieldName.equals(_DEFAULT_FIELD_NAME)) {
fieldName = f.getName();
}
int index = cursor.getColumnIndex(fieldName);
Class<?> fieldClass = f.getType();
if(fieldClass == Integer.class || fieldClass == int.class) {
f.setInt(sg, cursor.getInt(index));
}else if(fieldClass == Long.class || fieldClass == long.class) {
f.setLong(sg, cursor.getLong(index));
}else if(fieldClass == String.class ) {
f.set(sg, cursor.getString(index));
}else if(fieldClass == Boolean.class || fieldClass == boolean.class) {
f.setBoolean(sg, Boolean.valueOf(cursor.getString(index)));
}
}
}
return sg;
}
/*
 * 通过表名来获取对象的一个数组
 */
public Object[] getAll(String tblName, Class<?> clazz) throws Exception ,IllegalStateException{
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(tblName, null, null, null, null, null, null);
if(cursor.getCount() == 0) {
cursor.close();
return null;
}
Object[] objects = new Object[cursor.getCount()];
int i = 0;
cursor.moveToFirst();
do {
objects[i] = cursorToObject(cursor, clazz);
++i;
}while(cursor.moveToNext());
cursor.close();
return objects;
}
}
上面都有给出注释,就不多解释了。。
可以看出强大annotation的确可以带来很多方便。。。。。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值