Android用标注管理数据库的简单示例

现在市面上有很多利用标注操作数据库的源码和框架,这里我简单示例一下。

  • 新建标注
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name();
    String type();
    boolean isPID() default false;
}
  • 创建简单的SqlHelper
public class DbHelper extends SQLiteOpenHelper {

    private SQLiteDatabase mDb;

    public DbHelper(Context context, String name, CursorFactory factory,
                    int version) {
        super(context, name, factory, version);
        if (mDb == null) {
            mDb = context.openOrCreateDatabase(name, version, factory);
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    public void createTable(String sql){
        mDb.execSQL(sql);
    }

    public SQLiteDatabase getDB(){
        return mDb;
    }
}
  • 创建核心工具类
public class DBUtils {
    private static DBUtils instance;
    private DbHelper mDbHelper;
    private DBUtils(DbHelper helper){
        mDbHelper = helper;
    }
    public static DBUtils getInstance(Context context){
        if(instance == null){
            instance = new DBUtils(new DbHelper(context, "test.db", null, 1));
        }
        return instance;
    }

    //利用标注创建数据库
    public void createTable(Class clazz){
        StringBuilder sql = new StringBuilder("create table if not exists ");
        sql.append(clazz.getSimpleName());
        sql.append("(");
        for(Field field : clazz.getDeclaredFields()){
            if(field.isAnnotationPresent(Column.class)){
                Column column = field.getAnnotation(Column.class);
                String cname = column.name();
                sql.append(cname);
                sql.append(" ");
                sql.append(column.type());
                if(column.isPID()){
                    sql.append(" ");
                    sql.append("PRIMARY KEY ");
                }
                sql.append(",");
            }
        }
        sql.deleteCharAt(sql.length() - 1);
        sql.append(");");
        Log.e("zxdxp8l", sql.toString());
        mDbHelper.createTable(sql.toString());
    }
    // 下面两个方法就不用标注的了,就是写个demo看一下结果,觉得用stetho麻烦的可以用这个,
    // hardcode一个插入
    public void insert(Student stu){
        Random r = new Random(10000);
        String sql = "INSERT INTO Student (id,name,age) VALUES ("+1+", 'zx',"+ 25+")";
        mDbHelper.getDB().execSQL(sql);
    }

    // hardcode一个select
    public void search(){
        String sql = "Select id, name, age from Student";
        Cursor cr = mDbHelper.getDB().rawQuery(sql, null);
        if (cr.moveToFirst()) {
            for (int i = 0; i < cr.getCount(); i++) {
                String ret = cr.getInt(0) + "," + cr.getString(1) + "," + cr.getInt(2);
                Log.e("zxdxp8l", ret);
            }
        }
    }
}
  • 实例类
public class Student {
    // 实例类的属性都用上标注啦
    @Column(name = "id", type = "INT", isPID = true)
    private int id;
    @Column(name = "name", type = "TEXT")
    private int name;
    @Column(name = "age", type = "INT")
    private int age;

    public int getId() {
        return id;
    }

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

    public int getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 调用
DBUtils.getInstance(this).createTable(Student.class);

前面写那么多,就是为了这一下的爽快,以后创建新表的时候,直接写上标注用这句话就可以了,节约了大量的时间和少写了很多代码,而且还不容易出错。现在也有很多很强大的轻量级的第三方,比如LitePal这些开源的东西,基本原理也就和这个示例差不多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值