android 数据库的应用ORM (1)

来源:互联网 发布:js 离开页面事件 编辑:程序博客网 时间:2024/06/06 07:08

 记录自己的所学

自己在做项目的过程中常常用到数据库,所以花了一天的时间给自己写了个模板,在以后做项目的过程中可以直接拿出来用。

大体上有四个部分

1,表对应实体

2,配置类

3,业务类(对表进行CURD)

4,相应的一些工具类

先大概看下项目结构:

在包orm.annotation中自定义了些注解:主要的作用是生成创建表语句用的

com.ada.ormdemo.orm.annotation.Autoincrement.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Autoincrement{}
com.ada.ormdemo.orm.annotation.Check.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Check{String check();}
com.ada.ormdemo.orm.annotation.ForeignKey.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ForeignKey{String table();String name();}
com.ada.ormdemo.orm.annotation.IngnoreField.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface IngnoreField{}
com.ada.ormdemo.orm.annotation.Key.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Key{}
com.ada.ormdemo.orm.annotation.NotNull.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface NotNull{}
com.ada.ormdemo.orm.annotation.RefType.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface RefType{String key();}
com.ada.ormdemo.orm.annotation.Unique.java

package com.ada.ormdemo.orm.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Unique{}
以上是自定义一个些注释,主要是为后面组建创建表时使用。


定义类MySqliteOpenHelper类去继承SQLiteOpenHeloer类去创建数据库以及表
com.ada.ormdemo.orm.MySqliteOpenHelper.java

package com.ada.ormdemo.orm;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class MySqliteOpenHelper extends SQLiteOpenHelper{//数据库名public static final String DB_NAME = "mysqlite.db";//版本号public static final int DB_VERSION = 1;/** * 构造器 * @param context 当前上下文 * @param name数据库名 * @param factory  游标工厂 * @param version  版本号 */public MySqliteOpenHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);}/** * 构造器 * @param context */public MySqliteOpenHelper(Context context){this(context,DB_NAME,null,DB_VERSION);}/** * 当数据库不存在时调用 ,也是就第一次会被调用  */@Overridepublic void onCreate(SQLiteDatabase db) {DataBaseUtils.createtable(db);}/** * 当版本更新时会调用 */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
com.ada.ormdemo.app.MyAppOpenHelper.java

package com.ada.ormdemo.app;import com.ada.ormdemo.orm.MySqliteOpenHelper;public class MyAppOpenHelper extends MySqliteOpenHelper{public MyAppOpenHelper(){super(MyApplication.getInstance());}}

生成表语句以及一些数据类型的转换

com.ada.ormdemo.orm.DataBaseUtils.java

package com.ada.ormdemo.orm;import java.lang.reflect.Field;import java.lang.reflect.Type;import java.util.Collection;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import com.ada.ormdemo.orm.annotation.Autoincrement;import com.ada.ormdemo.orm.annotation.Check;import com.ada.ormdemo.orm.annotation.ForeignKey;import com.ada.ormdemo.orm.annotation.IngnoreField;import com.ada.ormdemo.orm.annotation.Key;import com.ada.ormdemo.orm.annotation.NotNull;import com.ada.ormdemo.orm.annotation.RefType;import com.ada.ormdemo.orm.annotation.Unique;import com.google.gson.Gson;import com.google.gson.JsonSyntaxException;/** * 数据库的工具类 * @author Administrator * */public class DataBaseUtils{private static final String TAG = "DataBaseUtils";/** * 用来创建表 */public static void createtable(SQLiteDatabase db){//得到所有要创建表的实体Collection<Class<?>> entities = ORMConfigurate.getAllEntity();for(Class<?> entity:entities){String sql = getSqlFormEntity(entity);Log.i(TAG, sql);db.execSQL(sql);}}/** * 得到表名 * @return */public static String getTableName(Class<?> entity){return entity.getName().replaceAll("\\.", "_");}public static String getSqlFormEntity(Class<?> entity){boolean isfirst = true;StringBuffer  sb = new StringBuffer();sb.append("CREATE TABLE IF NOT EXISTS");sb.append(" "+ getTableName(entity)+" (");Field[] fields = entity.getDeclaredFields();for(Field field: fields){String fname = field.getName();//ignoreFieldif(field.getAnnotation(IngnoreField.class) != null){continue;}if(isfirst){sb.append(" "+fname);isfirst = false;}else{sb.append(" , "+fname);}String ftype = JavaSqliteTypeMapping.getQliteType(field.getType());sb.append(" "+ftype);//pirmary keyif(field.getAnnotation(Key.class) != null){sb.append("  primary key");}//autoincrementif(field.getAnnotation(Autoincrement.class) != null){sb.append(" autoincrement");}//checkif(field.getAnnotation(Check.class) != null){Check check = field.getAnnotation(Check.class);String value = check.check();sb.append(" "+value);}//uniqueif(field.getAnnotation(Unique.class) != null){sb.append(" unique");}//not nullif(field.getAnnotation(NotNull.class) != null){sb.append(" not null");}//foreign keyif(field.getAnnotation(ForeignKey.class) != null){ForeignKey fk = field.getAnnotation(ForeignKey.class);String table = fk.table();String name = fk.name();sb.append(" references "+table+"("+name+")");}}sb.append(" )");return sb.toString();}public static ContentValues wrapEntityToContetValue(Object entity){ContentValues values = new ContentValues();try{Class<?> cls = entity.getClass();Field[] fields = cls.getDeclaredFields();for(Field field:fields){field.setAccessible(true);String key = field.getName();if(key.equals("id")){continue;}else if(field.getType() == int.class){values.put(key,field.getInt(entity));}else if(field.getType() == byte.class){values.put(key, field.getByte(entity));}else if(field.getType() == short.class){values.put(key, field.getShort(entity));}else if(field.getType() == long.class){values.put(key, field.getLong(entity));}else if(field.getType() == char.class){values.put(key, (short)field.getChar(entity));}else if(field.getType() == boolean.class){values.put(key, field.getBoolean(entity));}else if(field.getType() == float.class){values.put(key, field.getFloat(entity));}else if(field.getType() == double.class){values.put(key, field.getDouble(entity));}else if(field.getType() == String.class){values.put(key, (String)field.get(entity));}else{String value = wrapRefField(field,field.get(entity));if(value != null){values.put(key, value.getBytes());}}}} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}return values;}public static String wrapRefField(Field field,Object entity){Gson gson = new Gson();RefType refType = field.getAnnotation(RefType.class);if(refType != null){String key = refType.key();Type type = ORMConfigurate.getInstance().getType(key);return gson.toJson(entity, type);}return null;}public static Object wrapCursorToEntity(Cursor cursor,Class<?> entity){Object obj = null;try{obj = entity.newInstance();Field[] fields = entity.getDeclaredFields();for(Field field: fields){String name = field.getName();field.setAccessible(true);int index = cursor.getColumnIndex(name);if(index != -1){if(field.getType() == int.class){field.setInt(obj, cursor.getInt(index));}else if(field.getType() == byte.class){field.setByte(obj, (byte)cursor.getShort(index));}else if(field.getType() == short.class){field.setShort(obj, cursor.getShort(index));}else if(field.getType() == long.class){field.setLong(obj, cursor.getLong(index));}else if(field.getType() == char.class){field.setByte(obj, (byte)cursor.getShort(index));}else if(field.getType() == boolean.class){field.setBoolean(obj, cursor.getShort(index) > 0);}else if(field.getType() == float.class){field.setFloat(obj, cursor.getFloat(index));}else if(field.getType() == double.class){field.setDouble(obj, cursor.getDouble(index));}else if(field.getType() == String.class){field.set(obj, cursor.getString(index));}else{byte[] value = cursor.getBlob(index);setRefField(field,obj,value);}}}} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}return obj;}private static void setRefField(Field field, Object obj, byte[] value){RefType refType = field.getAnnotation(RefType.class);try{if(refType != null){String key = refType.key();Type type = ORMConfigurate.getInstance().getType(key);Gson gson = new Gson();Object object = gson.fromJson(new String(value), type);field.set(obj, object);} else{field.set(obj, field.getType());}} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();} }}

java类型与sqlite类型的映射

com.ada.ormdemo.orm.JavaSqliteTypeMapping.java

package com.ada.ormdemo.orm;/** * java类型与sqlite类型的映射 * @author Administrator * */public enum JavaSqliteTypeMapping{BYTE(byte.class,"INTEGER"),SHORT(short.class,"INTEGER"),INT(int.class,"INTEGER"),LONG(long.class,"INTEGER"),CHAR(char.class,"INTEGER"),BOOLEAN(boolean.class,"INTEGER"),FLOAT(float.class,"FLOAT"),DOUBLE(double.class,"DOUBLE"),STRING(String.class,"TEXT"),REFERENCE(null,"BLOB");private String stype;private Class<?> jtype;private JavaSqliteTypeMapping(Class<?> type,String stype){this.stype = stype;this.jtype = type;}public String getStype(){return stype;}public Class<?> getJtype(){return jtype;}/** * 根据java的类型得到sqlite对应的类型 * @param type * @return */public static String getQliteType(Class<?> type){JavaSqliteTypeMapping[]  mappings = JavaSqliteTypeMapping.values();for(JavaSqliteTypeMapping map: mappings){if(map.getJtype() == type){return map.getStype();}}return REFERENCE.getStype();}}


配置类

com.ada.ormdemo.orm.ORMConfigurate.java

package com.ada.ormdemo.orm;import java.lang.reflect.Field;import java.lang.reflect.Type;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import com.ada.ormdemo.orm.annotation.RefType;import com.ada.ormdemo.orm.entity.Goods;import com.ada.ormdemo.orm.service.BaseService;import com.ada.ormdemo.orm.service.IService;/** * orm的配置类 * @author Administrator * */public class ORMConfigurate{private static ORMConfigurate ormConfigurate;private static MySqliteOpenHelper   openHelper;private static Map<Class<?>,Class<?>> mEntityServiceMapping;private static Map<Class<?>,IService> mSerivceChche;private static Map<String,Type> mTypeMapping;private ORMConfigurate(){mEntityServiceMapping = new HashMap<Class<?>,Class<?>>();mSerivceChche = new HashMap<Class<?>,IService>();mTypeMapping = new HashMap<String,Type>();}/** *  得到实例 * @return */public static ORMConfigurate getInstance(){if(ormConfigurate == null){ormConfigurate = new ORMConfigurate();}return ormConfigurate;}public void setMySqliteOpenHelper(MySqliteOpenHelper  openHelper){this.openHelper = openHelper;}public MySqliteOpenHelper getMySqliteOpenHelper(){return this.openHelper;}/** * 注册实体 */public void register(Class<?> entity){register(entity,null);}/** *  注册实体及业务类 */public void register(Class<?> entity, Class<? extends IService> service){mEntityServiceMapping.put(entity, service);}/** * 得到所有的实体 * @return */public  static Collection<Class<?>> getAllEntity(){return mEntityServiceMapping.keySet();}public  Class<?> getEntityClass(IService service){for(Entry<Class<?>, IService> entry : mSerivceChche.entrySet()){if(entry.getValue() == service){return entry.getKey();}}return null;}/** * 注册类型 * @param cls * @param type */public void registType(Class<?> cls,Type type){Field[] fields = cls.getDeclaredFields();for(Field field : fields){RefType refType = field.getAnnotation(RefType.class);if(refType != null){String key = refType.key();mTypeMapping.put(key, type);}}}/** * 得到类型 * @param key * @return */public Type getType(String key){return mTypeMapping.get(key);}/** * 得到业务类 * @param class1 * @return */public IService getService(Class<Goods> cls){if(cls == null){return null;}Class<?> serviceCls = mEntityServiceMapping.get(cls);IService  service = mSerivceChche.get(cls);try{if(service == null){if(serviceCls != null){service = (IService) serviceCls.newInstance();}else{service = new BaseService();}System.out.println(service);mSerivceChche.put(cls, service);}} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}return service;}}

再以下是业务类

com.ada.ormdemo.orm.service.IService

package com.ada.ormdemo.orm.service;import java.util.List;public interface IService{/** * 添加一个实体 * @param entity * @return */public long insertEntity(Object entity);/** *  * @param entity 实体类型 * @return 得到所有的实体 */public List<Object> queryAllEntity(Class<?> entity);/** * 更新一个对象 * @param entity * @return */public long updateEntity(Object entity,long id);/** * 删除一个实体 * @param id * @param entity * @return */public long deleteEntity(long id,Class<?> entity);/** * 删除所有 * @return */public long deleteAll();public Object queryEntityById(long id,Class<?> entity);}

com.ada.ormdemo.orm.service.AbstractService.java

package com.ada.ormdemo.orm.service;import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.ada.ormdemo.orm.DataBaseUtils;import com.ada.ormdemo.orm.MySqliteOpenHelper;import com.ada.ormdemo.orm.ORMConfigurate;public abstract class AbstractService implements IService{private MySqliteOpenHelper mOpenHelper;private SQLiteDatabase  mDb;private String mTableName;public AbstractService(){this.mOpenHelper = ORMConfigurate.getInstance().getMySqliteOpenHelper();this.mDb = mOpenHelper.getWritableDatabase();}/** * 插入一个对象 */@Overridepublic long insertEntity(Object entity){ContentValues values = DataBaseUtils.wrapEntityToContetValue(entity);return mDb.insert(getTableName(), null, values);}/** * 得到此实体类型的所有实体 */@Overridepublic List<Object> queryAllEntity(Class<?> entity){List<Object> objs = new ArrayList<Object>();Cursor cursor = mDb.query(DataBaseUtils.getTableName(entity), null, null, null, null, null, null);while(cursor.moveToNext()){Object obj = DataBaseUtils.wrapCursorToEntity(cursor, entity);objs.add(obj);}return objs;}/** * 更新一个对象 */@Overridepublic long updateEntity(Object entity,long id){ContentValues values = DataBaseUtils.wrapEntityToContetValue(entity);return mDb.update(DataBaseUtils.getTableName(entity.getClass()), values,"id = ?",new String[]{id+""});}/** * 删除一个对象 */@Overridepublic long deleteEntity(long id,Class<?> entity){return mDb.delete(DataBaseUtils.getTableName(entity), "id = ?", new String[]{id+""});}public long deleteAll(){return mDb.delete(getTableName(), "1", null);}/** * 根据id来得到对象 */@Overridepublic Object queryEntityById(long id,Class<?> entity){Object obj = null;Cursor cursor = mDb.query(getTableName(), null, "id = ?", new String[]{id +""}, null, null, null);if(cursor.moveToFirst()){obj = DataBaseUtils.wrapCursorToEntity(cursor, entity);}return obj;}/** * 得到表名 * @return */public String getTableName(){if(mTableName == null){Class<?> cls = ORMConfigurate.getInstance().getEntityClass(this);mTableName = DataBaseUtils.getTableName(cls);}return mTableName;}}
BaseService.java

package com.ada.ormdemo.orm.service;public class BaseService extends AbstractService{}

大体的结构都贴出来了。

全部代码可以从这里下载 http://download.csdn.net/detail/dongxiaoyu/8379057





0 0
原创粉丝点击