欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android 通过反射让SQlite建表如此简单,androidsqlite,这篇文章告诉大家如何通过

来源: 开发者 投稿于  被查看 43815 次 评论:238

Android 通过反射让SQlite建表如此简单,androidsqlite,这篇文章告诉大家如何通过


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

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

20150717140241105.png

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


作者:阿拉灯神灯


用户评论