當(dāng)前位置:
首頁 >
Android 通过反射让SQlite建表
發(fā)布時(shí)間:2025/7/14
56
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Android 通过反射让SQlite建表
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.我們寫一個(gè)DBHelper繼承自SQLiteOpenHelper
public class DBHelper extends SQLiteOpenHelper{//數(shù)據(jù)庫的版本private final static int DB_VERSION = 1;//數(shù)據(jù)庫名private final static String DB_NAME = "ladeng.db";private Context mContext;//我們直接用super調(diào)用父類的構(gòu)造方法,這樣我們?cè)趯?shí)例化DBHelper的時(shí)候只需要傳入一個(gè)上下文參數(shù)就可以了public DBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);this.mContext = context;}//數(shù)據(jù)庫不存在的時(shí)候,調(diào)用這個(gè)方法 @Overridepublic void onCreate(SQLiteDatabase db) {createTables(db,0,0);}//版本號(hào)發(fā)生變化的時(shí)候,調(diào)用這個(gè)方法 @Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//1.刪除原來的表//2.調(diào)用onCreate重新創(chuàng)建數(shù)據(jù)庫 }/*** 建表語句,只需要一行就能建一個(gè)表*/private void createTables(SQLiteDatabase db, int oldVersion, int newVersion) {//createTable(Movie.class)返回的是sql建表語句//db.execSQL(sql) 執(zhí)行這條建表語句db.execSQL(createTable(Movie.class));}/*** 如果沒傳表明的話,默認(rèn)使用類名作為表明* @param clazz 實(shí)體類* @return*/private <T> String createTable(Class<T> clazz){return createTable(clazz, clazz.getSimpleName());}/*** 真正的建表方法* @param clazz 實(shí)體類* @param tableName 表明* @return sql建表語句*/private <T> String createTable(Class<T> clazz , String tableName){//實(shí)例化一個(gè)容器,用來拼接sql語句StringBuffer sBuffer = new StringBuffer();//sql語句,第一個(gè)字段為_ID 主鍵自增,這是通用的,所以直接寫死sBuffer.append("create table if not exists "+ tableName + " "+"(_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,");//得到實(shí)體類中所有的公有屬性Field[] fields = clazz.getFields();//遍歷所有的公有屬性for(Field field : fields){//如果屬性不為_id的話,說明是新的字段if (!field.getName().equals("_id")) {//得到屬性的基本數(shù)據(jù)類型String type = field.getType().getSimpleName();//如果是String類型的屬性,就把字段類型設(shè)置為TEXTif (type.equals("String")) {sBuffer.append(field.getName()+" TEXT,");//如果是int類型的屬性,就把字段類型設(shè)置為INTEGER}else if (type.equals("int")) {sBuffer.append(field.getName()+" INTEGER,");}}}//將最后的逗號(hào)刪除sBuffer.deleteCharAt(sBuffer.length()-1);//替換成); 表明sql語句結(jié)束sBuffer.append(");");//返回這條sql語句return sBuffer.toString();}}2.Movie實(shí)體類,實(shí)體類中的屬性就是表中的字段
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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//實(shí)例化我們的DBHelperDBHelper dbHelper = new DBHelper(this);//調(diào)用了這個(gè)方法后,DBHelper中的onCreate才會(huì)執(zhí)行 dbHelper.getReadableDatabase();} }4.我們?cè)赿ata/data/包名/databases/ladeng.db中查看表是否已經(jīng)建好
轉(zhuǎn)載于:https://www.cnblogs.com/wei1228565493/p/4654437.html
總結(jié)
以上是生活随笔為你收集整理的Android 通过反射让SQlite建表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挨踢(IT)脱口秀--2014年2015
- 下一篇: 我的Android进阶之旅------A