博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 通过反射让SQlite建表
阅读量:6069 次
发布时间:2019-06-20

本文共 3147 字,大约阅读时间需要 10 分钟。

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 
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 {    @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

你可能感兴趣的文章
【mac】mac上安装软件,报错 鉴定错误,但是安装包都是好的
查看>>
设计模式的6大原则
查看>>
【转】观看视频时启用硬件加速有什么用?如果关闭硬件加速又有什么区别呢?...
查看>>
Weblogic12c 单节点安装
查看>>
CentOS7下安装Docker-Compose操作记录
查看>>
【wpf】在win10系统上弹出toast和notification
查看>>
.axf 转化 .bin文件 的方法
查看>>
sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件
查看>>
Chapter 4 Invitations——15
查看>>
Spring Boot 2.0 Release Notes
查看>>
谈一谈python的垃圾回收机制
查看>>
windows上使用的免费连接linux终端xshell6,xftp6下载
查看>>
LeetCode 总结
查看>>
在Linux 中安装不了程序?教你一招解决!
查看>>
取得汉字拼音首字母的绝妙方法
查看>>
不再以讹传讹 剖析720P 1080i和1080P
查看>>
asp.net服务器控件button先执行js再执行后台的方法
查看>>
Eclipse上GIT插件EGIT使用手册
查看>>
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
查看>>
[转]delphi 有授权许可的字符串拷贝函数源码
查看>>