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中查看表是否已经建好

转载于:https://www.cnblogs.com/wei1228565493/p/4654437.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添字段灵活的数据类型处理通过操作对象来insert或者update记录支持多种查询方式,支持多自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新(目前只支持添加字段)@Table(name="t_user" , version=2) //修改版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值