反射建表

Android 通过反射让SQlite建表如此简单

我们通常使用SQlite的时候,如果我们有10张表,我们要写10个建表语句,而建表语句中只有一些字段的名字需要改而已,这样既费时又费力,还容易出错,我们知道写sql语句的时候经常会写错,如果写错程序就会崩掉,而且检查10个建表语句还可以,如果有100条我么就要疯了。这篇文章告诉大家如何通过反射来快速建表。

1.我们写一个DBHelper继承自SQLiteOpenHelper

  1. public class DBHelper extends SQLiteOpenHelper{
  2. //数据库的版本
  3. private final static int DB_VERSION = 1;
  4. //数据库名
  5. private final static String DB_NAME = "ladeng.db";
  6. private Context mContext;
  7. //我们直接用super调用父类的构造方法,这样我们在实例化DBHelper的时候只需要传入一个上下文参数就可以了
  8. public DBHelper(Context context) {
  9. super(context, DB_NAME, null, DB_VERSION);
  10. this.mContext = context;
  11. }
  12. //数据库不存在的时候,调用这个方法
  13. @Override
  14. public void onCreate(SQLiteDatabase db) {
  15. createTables(db, 0, 0);
  16. }
  17. //版本号发生变化的时候,调用这个方法
  18. @Override
  19. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  20. //1.删除原来的表
  21. //2.调用onCreate重新创建数据库
  22. }
  23. /**
  24. * 建表语句,只需要一行就能建一个表
  25. */
  26. private void createTables(SQLiteDatabase db, int oldVersion, int newVersion) {
  27. //createTable(Movie.class)返回的是sql建表语句
  28. //db.execSQL(sql) 执行这条建表语句
  29. db.execSQL(createTable(Movie.class));
  30. }
  31. /**
  32. * 如果没传表明的话,默认使用类名作为表明
  33. * @param clazz 实体类
  34. * @return
  35. */
  36. private String createTable(Class clazz){
  37. return createTable(clazz, clazz.getSimpleName());
  38. }
  39. /**
  40. * 真正的建表方法
  41. * @param clazz 实体类
  42. * @param tableName 表明
  43. * @return sql建表语句
  44. */
  45. private String createTable(Class clazz , String tableName){
  46. //实例化一个容器,用来拼接sql语句
  47. StringBuffer sBuffer = new StringBuffer();
  48. //sql语句,第一个字段为_ID 主键自增,这是通用的,所以直接写死
  49. sBuffer.append( "create table if not exists "+ tableName + " "+
  50. "(_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,");
  51. //得到实体类中所有的公有属性
  52. Field[] fields = clazz.getFields();
  53. //遍历所有的公有属性
  54. for(Field field : fields){
  55. //如果属性不为_id的话,说明是新的字段
  56. if (!field.getName().equals( "_id")) {
  57. //得到属性的基本数据类型
  58. String type = field.getType().getSimpleName();
  59. //如果是String类型的属性,就把字段类型设置为TEXT
  60. if (type.equals( "String")) {
  61. sBuffer.append(field.getName()+ " TEXT,");
  62. //如果是int类型的属性,就把字段类型设置为INTEGER
  63. } else if (type.equals( "int")) {
  64. sBuffer.append(field.getName()+ " INTEGER,");
  65. }
  66. }
  67. }
  68. //将最后的逗号删除
  69. sBuffer.deleteCharAt(sBuffer.length()- 1);
  70. //替换成); 表明sql语句结束
  71. sBuffer.append( ");");
  72. //返回这条sql语句
  73. return sBuffer.toString();
  74. }
  75. }

2.Movie实体类,实体类中的属性就是表中的字段

  1. public class Movie {
  2. public String title;
  3. public int rating;
  4. public String year;
  5. public String genre;
  6. public String country;
  7. public int price;
  8. }

3.在MainActivity.java中添加如下代码

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. //实例化我们的DBHelper
  7. DBHelper dbHelper = new DBHelper( this);
  8. //调用了这个方法后,DBHelper中的onCreate才会执行
  9. dbHelper.getReadableDatabase();
  10. }
  11. }

4.我们在data/data/包名/databases/ladeng.db中查看表是否已经建好

这样我们就直接设计好一个实体类,然后就能构建出相应的数据库表了,而不用再去写一遍建表语句了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值