zoukankan      html  css  js  c++  java
  • Android 通过反射让SQlite建表

    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;
        }
        //数据库不存在的时候,调用这个方法
        @Override
        public void onCreate(SQLiteDatabase db) {
            createTables(db,0,0);
        }
    
    
        //版本号发生变化的时候,调用这个方法
        @Override
        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 <T> String createTable(Class<T> clazz){
            return createTable(clazz, clazz.getSimpleName());
        }
        /**
         * 真正的建表方法
         * @param clazz 实体类
         * @param tableName 表明
         * @return sql建表语句
         */
        private <T> String createTable(Class<T> 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 {
    
        @Override
        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中查看表是否已经建好

  • 相关阅读:
    R安装程序包:ERROR: failed to lock directory ‘/usr/lib64/R/library’ for modifying
    clusterProfiler
    R 画图保存为文件
    网站支持https之一:https原理和SSL证书类型
    Https系列之一:https的简单介绍及SSL证书的生成
    What is the difference between a directory and a folder?
    漫画解读:通过造车来了解软件开发模式 DevOps
    Multicast delegate of type Func (with return value)?
    What are good ways to prevent SQL injection? [duplicate]
    SqlCommand.Prepare Method
  • 原文地址:https://www.cnblogs.com/wei1228565493/p/4654437.html
Copyright © 2011-2022 走看看