Android数据库Sqlite的基本用法及升级策略
来源:互联网 发布:vscode typings文件 编辑:程序博客网 时间:2024/05/16 16:13
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已经被创建好了,并且表中已经有了插入的数据,如下:
到此我们已经完成了基本的数据库创建过程。
数据库升级:
在版本迭代的过程中,我们难免不了要去改变我们数据库的内容,此时就要考虑我们的数据库升级问题了,假如此时我们有个需求,要在新的版本中在数据库表中新加一个字段,首先我们要把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); }
升级到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); }
实验结果可知,各种情况都可以兼容,个人觉得这种方案更好一些,注意数据库的版本号只能升级,不能降级,例如不能将数据库版本号从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/
- Android数据库Sqlite的基本用法及升级策略
- SQLite数据库的创建及升级数据库
- Android Sqlite的基本用法
- android的SQLite基本用法
- Android学习笔记----SQLite数据库基本用法
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留 (
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
- Android版本升级同时Sqlite数据库的升级及之前数据的保留-转
- Android SQLite数据库升级
- Android SQLite升级数据库
- Android Sqlite 数据库升级
- 使用vue-cli没有'dev-server.js'以及'dev-client.js'文件
- 压测netty框架,返回少量java.net.ConnectException:Connection timed out,优化代码
- 学python(01)——一个小白关于递归的理解
- rancher下的kubernetes之二:安装rancher和kubernetes
- JAVA的特点
- Android数据库Sqlite的基本用法及升级策略
- 红黑树
- 用栈实现表达式的求值(iOS计算器的实现)
- 《Effective Java》读后感(一)
- 状态机(二):Verilog状态机实现
- Solve Kafka"Failed to send messages after 3 tries"
- Python3 数据结构与算法之冒泡排序
- iOS Technical support
- 初级统计单词个数