Android 通过反射让SQlite建表如此简单

我们通常使用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中查看表是否已经建好

时间: 2025-01-17 22:27:01

Android 通过反射让SQlite建表如此简单的相关文章

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调用父类的构造方法,这样我们在实

SQLite建表错误

android.database.sqlite.SQLiteException: near "tab": syntax error (code 1): , while compiling: create tab student(id integer primary key autoincrement ,name char(20),gender char(4),age integer) 我的建表SQL语句中使用了tab而不是”table“,所以报了这个错误  无法创建数据库SQL语句错了

Android开发时,sqlite创建表成功,insert不报错,但没有数据插入的原因

在android开发过程中,经常要通过sqlite来存储一些数据,这种应用应该是再平常不过了,但是有时难免一时疏忽,就会出现sqlite创建表成功,insert不报错,但没有数据插入. 具体问题详见如下代码: Context ctx;        SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); // 开启事务        db.beginTransaction();        try{                // 数

SQLite建表和增删改示例

1.建表 create table t_emp( empno Integer PRIMARY KEY autoincrement, ename varchar(20), job varchar(10), mgr Integer, hiredate date, sal REAL, comm REAL, deptno int ); 2.增加 insert into t_emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (1,'SMIT

在android中如何查看sqlite数据表结构,以及data文件打不开问题

1.root你的手机 2.cmd进入DOS界面,并且cd 转换目录到AndroidSDK\platform-tools中 3.输入adb shell 4.输入su,进入root权限,此时$变为#,输入ls命令可以看到手机目录 5.输入chomd 777 /data/data    这一步的作用是改变目录/data/data的权限,使其可以打开 6.在eclipse中找到 DDMS,它在 打开即可进入目录 7.此时你想打开哪个应用的目录,仿照第五步进行修改权限,进入你所要求的目录 8.点击红框按钮

SQLite建表并添加数据

Android数据存储之SQLite数据库

SQLite是一个小巧的嵌入式数据库,使用方便.开发简单,手机上最早由IOS运用,后来Android也采用了SQLite. SQLite的多数SQL语法与Oracle 一样,下面只列出不同的地方: (1)建表时为避免重复操作,应加上IF NOT EXISTS关键词,例如CREATE TABLE IF NOT EXISTS table_name (2)删表时为避免重复操作,应加上IF EXISTS关键词,例如DROP TABLE IF EXISTS table_name (3)添加新列时使用ALT

Android中使用Sqlite数据库 (一) 建表

一.实现一个类,继承SQLiteOpenHelper类,并实现构造函数,onCreate()  onUpgrade() import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; impo

Sqlite嵌入式数据库的安装、建库、建表、更新表结构以及数据导入导出等等详细过程记录

简介: SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.我觉得SQLite的功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信. 而令人印象深刻的特点是你可将你的整个数据库系统放在其中.利用非常高效的内存组织,SQLite只需在很小的内存中维护其很小的