Android 通过反射让SQlite建表
2015-07-17 14:44
429 查看
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中查看表是否已经建好
相关文章推荐
- Android开发之PagerAdapter
- Android_开源项目_XUtils_断点下载
- 全志a33核心板方案应用
- Intent的定义及用法
- Android 使用SpannableString显示复合文本
- Android搭建本地服务
- Android中Listview(六)--索引ListView
- android gradle构建工具
- Android Studio相关资源
- Android.mk教程(一)
- Android Dialog背景全透明 无边框
- Android中SQLite应用详解
- Android中Activity启动模式详解
- Android -- EventBus解析
- Android中写入读取XML
- Android的LinearLayout.getLayoutParams().width 和 LinearLayout.getWidth() 的区别
- android studio 的使用
- android的activitygroup使用
- AndroidStudio项目发布到GitHub
- Android中selector背景选择器