android sqlite orm框架

package com.heyi.data;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import com.heyi.utils.NameUtil;

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

/**
 * 
 * @author Neo
 * 
 */
public class DBHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 1;

    public DBHelper(Context context) {
        // CursorFactory set to null, use the default values
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    /**
     * The database is created for the first time the onCreate will be invoked
     */
    @Override
    public void onCreate(SQLiteDatabase db) {

        String tableBuffer2 = createTable(User.class);

        db.execSQL(tableBuffer2);
    }

    /**
     * Create table by class.
     * 
     * @param clazz
     *            the model class.
     * @return SQL string.
     */
    private String createTable(Class<?> clazz) {
        StringBuffer tableBuffer = new StringBuffer(
                "CREATE TABLE IF NOT EXISTS ");
        // Table name.
        tableBuffer.append(NameUtil.camel4underline(clazz.getSimpleName()));
        tableBuffer.append("(");
        // Other field.
        Field[] fieldlist = clazz.getDeclaredFields();
        for (int i = 0; i < fieldlist.length; i++) {
            Field fld = fieldlist[i];
            tableBuffer.append(NameUtil.camel4underline(fld.getName()));
            tableBuffer.append(" ");
            if (fld.getType() == int.class) {
                tableBuffer.append("INTEGER");
            } else if (fld.getType() == String.class) {
                tableBuffer.append("TEXT");
            } else if (fld.getType() == Double.class
                    || fld.getType() == Float.class) {
                tableBuffer.append("REAL");
            }
            tableBuffer.append(", ");
        }
        tableBuffer.delete(tableBuffer.length() - 2, tableBuffer.length());
        tableBuffer.append(")");

        return tableBuffer.toString();
    }

    /**
     * If the DATABASE_VERSION value is changed to 2, the system found an
     * existing database version, namely onUpgrade will call
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
    }

    /**
     * Add a new Object.
     * 
     * @param obj
     * @param db
     */
    public void add(Object obj, SQLiteDatabase db) {
        try {
            StringBuffer sqlBuffer = new StringBuffer();
            sqlBuffer.append("INSERT INTO ");
            sqlBuffer.append(NameUtil.camel4underline(obj.getClass()
                    .getSimpleName()));
            sqlBuffer.append("(");
            Field[] fieldlist = obj.getClass().getDeclaredFields();
            StringBuffer vals = new StringBuffer(" VALUES(");
            Object[] objs = new Object[fieldlist.length];
            for (int i = 0; i < fieldlist.length; i++) {
                Field fld = fieldlist[i];
                sqlBuffer.append(NameUtil.camel4underline(fld.getName()));
                sqlBuffer.append(", ");
                vals.append("?, ");
                fld.setAccessible(true);
                objs[i] = fld.get(obj);
            }
            sqlBuffer.delete(sqlBuffer.length() - 2, sqlBuffer.length());
            sqlBuffer.append(")");
            vals.delete(vals.length() - 2, vals.length());
            vals.append(")");
            sqlBuffer.append(vals);

            db.beginTransaction();
            db.execSQL(sqlBuffer.toString(), objs);
            db.setTransactionSuccessful();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } finally {
            if (db.inTransaction()) {
                db.endTransaction();

            }
        }
    }

    /**
     * Delete object by ID.
     * 
     * @param obj
     * @param db
     */
    public void delete(Object obj, SQLiteDatabase db) {
        try {
            Field IDField = obj.getClass().getDeclaredField("id");
            IDField.setAccessible(true);
            String id = (String) IDField.get(obj);
            String sql = "DELETE FROM "
                    + NameUtil.camel4underline(obj.getClass().getSimpleName())
                    + " WHERE id='" + id + "'";
            db.execSQL(sql);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    /**
     * Update a Object by ID.
     * 
     * @param obj
     * @param db
     */
    public void update(Object obj, SQLiteDatabase db) {
        try {
            Field IDField = obj.getClass().getDeclaredField("id");
            IDField.setAccessible(true);
            String id = (String) IDField.get(obj);

            StringBuffer sqlBuffer = new StringBuffer();
            sqlBuffer.append("UPDATE ");
            sqlBuffer.append(NameUtil.camel4underline(obj.getClass()
                    .getSimpleName()));
            sqlBuffer.append(" SET ");
            Field[] fieldlist = obj.getClass().getDeclaredFields();
            for (int i = 0; i < fieldlist.length; i++) {
                Field fld = fieldlist[i];
                fld.setAccessible(true);
                sqlBuffer.append(NameUtil.camel4underline(fld.getName()));
                sqlBuffer.append("='");
                sqlBuffer.append(fld.get(obj));
                sqlBuffer.append("',");
            }
            sqlBuffer.deleteCharAt(sqlBuffer.length() - 1);
            sqlBuffer.append(" WHERE id='");
            sqlBuffer.append(id);
            sqlBuffer.append("'");
            db.execSQL(sqlBuffer.toString());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {

        }
    }

    /**
     * Get Object by ID.
     * 
     * @param clazz
     * @param db
     * @param _id
     * @return
     */
    public Object get(Class<?> clazz, SQLiteDatabase db, String id) {
        Cursor c = db.rawQuery(
                "SELECT * FROM "
                        + NameUtil.camel4underline(clazz.getSimpleName())
                        + " WHERE id=?", new String[] { id });
        try {
            if (c != null && c.moveToFirst()) {
                return cursor2Obj(clazz, c);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            if (c != null) {
                c.close();
            }
        }
        return null;
    }

    /**
     * Get all object for the class.
     * 
     * @param clazz
     *            class type.
     * @param db
     *            SQLiteDatabase.
     * @return all object.
     */
    public List<Object> getAll(Class<?> clazz, SQLiteDatabase db) {
        List<Object> list = new ArrayList<Object>();
        Cursor c = db
                .rawQuery(
                        "SELECT * FROM "
                                + NameUtil.camel4underline(clazz
                                        .getSimpleName()), null);
        try {
            while (c != null && c.moveToNext()) {
                list.add(cursor2Obj(clazz, c));
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            if (c != null) {
                c.close();
            }
        }
        return list;
    }

    /**
     * Convert cursor to Object.
     * 
     * @param clazz
     * @param c
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws NoSuchFieldException
     */
    private Object cursor2Obj(Class<?> clazz, Cursor c)
            throws InstantiationException, IllegalAccessException,
            NoSuchFieldException {
        String[] columnNames = c.getColumnNames();
        Object obj = clazz.newInstance();
        for (int i = 0; i < columnNames.length; i++) {
            String columnName = columnNames[i];
            int columnIndex = c.getColumnIndex(columnName);
            Field field = clazz.getDeclaredField(NameUtil
                    .underline4camel(columnName));
            field.setAccessible(true);
            Object val = null;
            int type = c.getType(columnIndex);
            switch (type) {
            case Cursor.FIELD_TYPE_BLOB:
                break;
            case Cursor.FIELD_TYPE_FLOAT:
                val = c.getDouble(columnIndex);
                break;
            case Cursor.FIELD_TYPE_INTEGER:
                val = c.getInt(columnIndex);
                break;
            case Cursor.FIELD_TYPE_NULL:
                break;
            case Cursor.FIELD_TYPE_STRING:
                val = c.getString(columnIndex);
                break;
            default:
                break;
            }
            field.set(obj, val);
        }
        return obj;
    }
}

User.java类

package com.heyi.data;

import com.heyi.utils.ClassUtil;

public class User {

    private String id;
    
    private String name;
    
    private Double score;
    
    private int level;
    
    private String qqEmail;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    @Override
    public String toString() {        
        return ClassUtil.printObject(this);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getQqEmail() {
        return qqEmail;
    }

    public void setQqEmail(String qqEmail) {
        this.qqEmail = qqEmail;
    }    
}

ClassUtil.java

package com.heyi.utils;

import java.lang.reflect.Field;

public class ClassUtil {

    public static String printObject(Object obj){
        try {
            StringBuffer buffer = new StringBuffer();
            Field[] fields = obj.getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                field.setAccessible(true);
                buffer.append(field.getName());
                buffer.append(":");
                buffer.append(field.get(obj));
                buffer.append(" ");
            }
            return buffer.toString();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值