Android 通过反射让SQlite建表如此简单
我们通常使用SQlite的时候,如果我们有10张表,我们要写10个建表语句,而建表语句中只有一些字段的名字需要改而已,这样既费时又费力,还容易出错,我们知道写sql语句的时候经常会写错,如果写错程序就会崩掉,而且检查10个建表语句还可以,如果有100条我么就要疯了。这篇文章告诉大家如何通过反射来快速建表。
1.我们写一个DBHelper继承自SQLiteOpenHelper
-
public class DBHelper extends SQLiteOpenHelper{
-
//数据库的版本
-
private final static int DB_VERSION = 1;
-
//数据库名
-
private final static String DB_NAME = "ladeng.db";
-
-
private Context mContext;
-
-
//我们直接用super调用父类的构造方法,这样我们在实例化DBHelper的时候只需要传入一个上下文参数就可以了
-
public DBHelper(Context context) {
-
super(context, DB_NAME, null, DB_VERSION);
-
this.mContext = context;
-
}
-
//数据库不存在的时候,调用这个方法
-
-
public void onCreate(SQLiteDatabase db) {
-
createTables(db, 0, 0);
-
}
-
-
-
//版本号发生变化的时候,调用这个方法
-
-
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
//1.删除原来的表
-
//2.调用onCreate重新创建数据库
-
}
-
/**
-
* 建表语句,只需要一行就能建一个表
-
*/
-
private void createTables(SQLiteDatabase db, int oldVersion, int newVersion) {
-
//createTable(Movie.class)返回的是sql建表语句
-
//db.execSQL(sql) 执行这条建表语句
-
db.execSQL(createTable(Movie.class));
-
}
-
/**
-
* 如果没传表明的话,默认使用类名作为表明
-
* @param clazz 实体类
-
* @return
-
*/
-
private String createTable(Class clazz){
-
return createTable(clazz, clazz.getSimpleName());
-
}
-
/**
-
* 真正的建表方法
-
* @param clazz 实体类
-
* @param tableName 表明
-
* @return sql建表语句
-
*/
-
private String createTable(Class clazz , String tableName){
-
//实例化一个容器,用来拼接sql语句
-
StringBuffer sBuffer = new StringBuffer();
-
//sql语句,第一个字段为_ID 主键自增,这是通用的,所以直接写死
-
sBuffer.append( "create table if not exists "+ tableName + " "+
-
"(_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,");
-
//得到实体类中所有的公有属性
-
Field[] fields = clazz.getFields();
-
//遍历所有的公有属性
-
for(Field field : fields){
-
//如果属性不为_id的话,说明是新的字段
-
if (!field.getName().equals( "_id")) {
-
//得到属性的基本数据类型
-
String type = field.getType().getSimpleName();
-
//如果是String类型的属性,就把字段类型设置为TEXT
-
if (type.equals( "String")) {
-
sBuffer.append(field.getName()+ " TEXT,");
-
//如果是int类型的属性,就把字段类型设置为INTEGER
-
} else if (type.equals( "int")) {
-
sBuffer.append(field.getName()+ " INTEGER,");
-
}
-
}
-
}
-
//将最后的逗号删除
-
sBuffer.deleteCharAt(sBuffer.length()- 1);
-
//替换成); 表明sql语句结束
-
sBuffer.append( ");");
-
//返回这条sql语句
-
return sBuffer.toString();
-
}
-
-
}
2.Movie实体类,实体类中的属性就是表中的字段
-
public class Movie {
-
public String title;
-
public int rating;
-
public String year;
-
public String genre;
-
public String country;
-
public int price;
-
}
3.在MainActivity.java中添加如下代码
-
public class MainActivity extends Activity {
-
-
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
//实例化我们的DBHelper
-
DBHelper dbHelper = new DBHelper( this);
-
//调用了这个方法后,DBHelper中的onCreate才会执行
-
dbHelper.getReadableDatabase();
-
}
-
}
4.我们在data/data/包名/databases/ladeng.db中查看表是否已经建好
这样我们就直接设计好一个实体类,然后就能构建出相应的数据库表了,而不用再去写一遍建表语句了