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

来源:互联网 发布:擎洲广达计价软件 编辑:程序博客网 时间:2024/06/01 10:03

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

  • 新建标注
@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这些开源的东西,基本原理也就和这个示例差不多。


原创粉丝点击