现在市面上有很多利用标注操作数据库的源码和框架,这里我简单示例一下。
- 新建标注
@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这些开源的东西,基本原理也就和这个示例差不多。