Android数据库Sqlite的核心用法及提升策略

SQLite简介

SQLite是同等磨蹭轻型的数据库,是遵守ACID的关联式数据库管理网,它的规划目标是停放
式的,而且手上曾经于诸多嵌入式产品受应用了其,它占用资源十分之低位,在嵌入式设备受到,可能只需要几百K的内存就够了。它能支持
Windows/Linux/Unix等等主流的操作系统,同时能与森程序语言相结合,比如Tcl、PHP、Java、C++、.Net等,还有ODBC接口,同样于由
Mysql、PostgreSQL这半迟迟开源世界闻名的数据库管理网来讲,它的处理速度比她们都快。

SQLite数据类型

诚如数量应用的稳的静态数据类型,而SQLite采用的是动态数据类型,会因存入值自动判断。SQLite具有以下五种常用之数据类型:

NULL: 这个价值也空值

VARCHAR(n):长度不稳定且该最为深尺寸也 n 的字串,n不能够过 4000。

CHAR(n):长度固定为n的字串,n不可知跨越 254。

INTEGER: 值被标识为整数,依据值的分寸可以依次给积存吗1,2,3,4,5,6,7,8.

REAL: 所有价都是变化的数值,被积存吗8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数格式进行仓储。如何输入就什么样存储,不改
变格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小时、分钟、秒。

数据库SQL增删改查语句:

sql语句不区分轻重缓急写

  • 查找:
    select column1,column2 from table_name
    或者
    select * from table_name

  • 插入:
    insert into table_name(column1,column2) values (value1,value2)

  • 更新:
    履新都有表的多少:
    update table_name set column1 = value1, column2 = value2
    where +条件语句

朝表中插入列:
alter table table_name add column column_name
text(varchar(10)、char等)

  • 删除:
    delete from table_name where +条件语句

数据库创建:

率先创建一个近乎去继续SQLiteOpenHelper,创建一个test.db的数据库

public class DBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "test.db";
    public static final int DB_VERSION = 1;


    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DBDao.SQL_CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    }

}

内onCreate()是在数据库首次于创的时段调用,onUpgrade()是于数据库版本号DB_VERSION升级的时节才会调用

打包增删改查方法:

public class DBDao {

    public static final String TABLE_NAME = "student";//表名

    private static final String ID = "id";//id自增长
    private static final String NAME = "stu_name";//姓名
    private static final String AGE = "stu_age";//年龄
    private static final String SEX = "stu_sex";//性别
    private static final String GRADE = "stu_grade";//年级
    //DB_Version2增加新字段
    private static final String SCORE = "store";

    private DBHelper dbHelper;

    //创建表结构
    public static final String SQL_CREATE_TABLE = "create table " + TABLE_NAME + "(" +
            ID + " integer primary key autoincrement," +
            NAME + " text," +
            AGE + " integer," +
            SEX + " varchar(5)," +
            GRADE + " text" +
            ")";


    private DBDao() {
        dbHelper = new DBHelper(MyApplication.getContext());
    }

    public static DBDao getInstance() {
        return InnerDB.instance;
    }

    private static class InnerDB {
        private static DBDao instance = new DBDao();
    }

    /**
     * 数据库插入数据
     *
     * @param bean 实体类
     * @param <T>  T
     */
    public synchronized <T> void insert(T bean) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        try {
            if (bean != null && bean instanceof Student) {
                Student student = (Student) bean;
                ContentValues cv = new ContentValues();
                cv.put(NAME, student.getName());
                cv.put(AGE, student.getAge());
                cv.put(SEX, student.getSex());
                cv.put(GRADE, student.getGrade());
                cv.put(SCORE, student.getStore());
                db.insert(TABLE_NAME, null, cv);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.close();
        }
    }

    /**
     * 删除表中所有的数据
     */
    public synchronized void clearAll() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        String sql = "delete from " + TABLE_NAME;

        try {
            db.execSQL(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.close();
        }
    }

    /**
     * 查询数据
     *
     * @return List
     */
    public synchronized <T> List<T> query() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        List<T> list = new ArrayList<>();
        String querySql = "select * from " + TABLE_NAME;
        Cursor cursor = null;
        try {
            cursor = db.rawQuery(querySql, null);
            while (cursor.moveToNext()) {
                Student student = new Student();
                student.setName(cursor.getString(cursor.getColumnIndex(NAME)));
                student.setAge(cursor.getInt(cursor.getColumnIndex(AGE)));
                student.setSex(cursor.getString(cursor.getColumnIndex(SEX)));
                student.setGrade(cursor.getString(cursor.getColumnIndex(GRADE)));
                student.setStore(cursor.getString(cursor.getColumnIndex(SCORE)));
                list.add((T) student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return list;
    }

}

创立实体类:

public class Student {
    private String name;
    private int age;
    private String grade;
    //Version2添加
    private String sex;

    public String getStore() {
        return store;
    }

    public void setStore(String store) {
        this.store = store;
    }

    private String store;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Student() {
    }

    public Student(String name, int age, String grade, String sex,String store) {
        this.name = name;
        this.age = age;
        this.grade = grade;
        this.sex = sex;
        this.store=store;
    }
}

执行数据库操作:

Student student = new Student("小明", 20, "三年二班", "man");
DBDao.getInstance().insert(student);

insert()方法被调用了dbHelper.getWritableDatabase(),此时没test.db数据库则会失掉创造,接着执行onCreate()去创造了student表并插入了千篇一律长条数据,去data/data/package_name/databases下查看发现test.db已经为创造好了,并且表中已经生矣插入的数码,如下:

S71029-14273028.jpg

交者我们曾到位了中心的数据库创建过程。

数据库升级:

每当本迭代的长河中,我们难免不了而错过改变我们数据库的始末,此时即将考虑我们的数据库升级问题了,假如这咱们出只需要,要当新的版中以数据库表中新加一个字段,首先我们而把DB_VERSION提升到2,那么安装新本子APK的时刻就会见履onUpdate()操作去实践更新操作,那么我们直接把创新的操作放到onUpdate()就可以了为?当然十分!我们要考虑各个版本的状态,比如用户并未设置了1.0版本,直接设置的2.0本子,那么这种场面是匪见面实行onUpdate()方法的,以后来矣3.0、4.0版,逻辑将再度复杂,所以特的放onUpdate()中凡是不可行的,还有雷同种植艺术:

  @Override
  public void onCreate(SQLiteDatabase database) {
      database.execSQL(DBDao.SQL_CREATE_TABLE);
  }

  @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        try {
            db.execSQL("DROP TABLE IF EXISTS student");
            this.onCreate(db);
        } catch (Exception e) {
        }

    }

这种的于创新时一直将原来的表删除掉然后手动去调onCreate()去重建表,个人觉得不够优雅,首先老多少会丢掉,假如要手动保存,表中数据量大时操作起来吧无便民,那么闹没发生重新好有之不二法门为?看下面这种方式:

    private static final String DB_NAME = "test.db";
    public static final int DB_VERSION = 2;

    @Override
    public void onCreate(SQLiteDatabase database) {
        int initDBVersion = 1;
        DataBaseHelper.initDB(database);
        onUpgrade(database, initDBVersion, DB_VERSION);
    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
        for (int i = oldVersion; i < newVersion; i++) {
            switch (i) {
                case 1:
                    DataBaseHelper.upToDbVersion2(database);
                    break;
                case 2:
                    DataBaseHelper.upToDbVersion3(database);
                    break;
                default:
                    break;
            }
        }
    }

如果用户是从1.0升高至2.0之,那么会直接执行onUpdate(),此时oldVersion是1,执行for循环中之DataBaseHelper.upToDbVersion2(database),如果用户没有假装过1.0本子而是一直装之2.0本子,那么会实行onCreate()方法,在onCreate()中手动调用的onUpdate()方法去履行更新操作,这样即使配合到了各种要求,同时晋级至3.0、4.0本都是好配合的,比如以2.0时时想以老表中新加相同排列:

 public static void upToDbVersion2(SQLiteDatabase database) {
     String updateSql = "alter table " + DBDao.TABLE_NAME + " add column store varchar(5)";
     database.execSQL(updateSql);
 }

S71029-14285063.jpg

提升至3.0时不时想管列store中的值都改成化100:

 public static void upToDbVersion3(SQLiteDatabase database) {
     ContentValues values = new ContentValues();
     values.put("store", 100);
     database.update(DBDao.TABLE_NAME, values, null, null);
 }

S71029-14580506.jpg

试验结果可知,各种气象尚且可以匹配,个人认为这种方案还好有,注意数据库的版本号只能升级,不可知降,例如不可知用数据库版本号于2降到1:

Caused by: android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1

源码地址:http://download.csdn.net/download/u013700502/10043778

参考:http://www.w3school.com.cn/sql/index.asp
http://www.runoob.com/sqlite/sqlite-update.html
http://blog.csdn.net/codeeer/article/details/30237597/

网站地图xml地图