Android 数据持久化之SQLite
SQLite是android系统自带的轻量级数据库,占用内存小,不用引用直接可以使用,是数据持久化在正式项目中的理想之选。本文主要简单的介绍如何在android使用SQLite数据库,包括数据库的创建与更新,以及如何新加已创建表字段和最简单的增删改查方法。至于其余的增删改查方法都是大同小异,真正的项目中是需要如事例中一样编写简单的sql语句的。
一、SQLite的使用方法
1.创建DBHelper来继承SQliteOpenHelper,并重写onCreate和onUpgrade两个方法。这个类的作用就是对数据库表进行创建和升级使用。
2.调用getWritableDatabase或者getReadableDatabase最后对数据库进行执行操作。
二、数据库的创建
1.创建DBHelper来继承SQliteOpenHelper,并实现构造方法
public class DBHelper extends SQLiteOpenHelper{
// 数据库 db 文件名称
private static final String DEFAULT_NAME = "test.db";
// 默认版本号
private static final int DEFAULT_VERSION = 1;
private Context mContext;
public DBHelper(Context context) {
super(context, DEFAULT_NAME, null, DEFAULT_VERSION, null);
mContext = context;
}
/**
* 数据表的创建
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
}
/**
* 数据库版本的更新
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.在onCreate方法中编写建表语句
/**
* 数据表的创建
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//此处把创建表的命令转换为String类型,id为主键自增长的int型数据
//text代表文本类型,integer代表整型,real代表浮点类型,blob代表二进制类型
final String create_person="create table Person ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "sex text, "
+ "age integer, "
+ "point real)";
//执行建表语句
db.execSQL(create_person);
Toast.makeText(mContext,"人物表创建成功",Toast.LENGTH_SHORT).show();
}
3.再创建一个数据库的管理类DBManager ,以后对数据表的增删改查都在这里实现。
public class DBManager {
private DBHelper dbHelper;
private SQLiteDatabase database;
public DBManager(Context context){
dbHelper = new DBHelper(context);
database = dbHelper.getWritableDatabase();
}
}
4.实现数据库表的创建,只要在对应的地方实现下列两行代码即可。
private DBManager dbManager;
dbManager = new DBManager(MainActivity.this);
三、数据库的更新
1.当onCreate已经执行一次后,在应用不卸载的情况下,如果我们要新增别的表,我们只能在onUpgrade中执行,并且把数据库版本增大,如原来是DEFAULT_VERSION=1,现在要改了DEFAULT_VERSION大于1即可,不然是不会执行成功的,除非卸载应用重新装
/**
* 数据库版本的更新
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当onCreate已经执行一次后,在应用不卸载的情况下,如果我们要新增别的表,我们只能在onUpgrade中执行,并且把数据库版本增大,如原来是DEFAULT_VERSION=1,现在要改了DEFAULT_VERSION大于1即可。
final String create_student="create table Student ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "sex text, "
+ "age integer, "
+ "point real)";
db.execSQL(create_student);
Toast.makeText(mContext,"学生表创建成功",Toast.LENGTH_SHORT).show();
}
2.更新已存在表的列,当表已经存在而我们需要为表添加一个新的字段,只能在onUpgrade中执行,而添加条件判断就意味着只有在老版本为特定版本的时候才会在Person 中添加新的列address,而别的版本不会去增加。
if (oldVersion==2){
final String AddCharColumn = "ALTER TABLE Person ADD COLUMN address text";
db.execSQL(AddCharColumn);
}
四、向数据表添加数据
1.首先根据创建Person实体类和数据库表Person对应
public class Person {
private String name;
private int age;
private String sex;
private float point;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public float getPoint() {
return point;
}
public void setPoint(float point) {
this.point = point;
}
}
2.在DBManager中添加新增数据的方法addPersonData
/**
* 向人物表添加数据
* @param person
* @return
*/
public boolean addPersonData(Person person){
try {
database.beginTransaction();
final String sql = "INSERT INTO Person VALUES(NULL,?,?,?,?)";
Object[] objects = new Object[]{
person.getName(),person.isSex(),person.getAge(),person.getPoint()
};
database.execSQL(sql,objects);
database.setTransactionSuccessful();
} catch (Exception e) {
return false;
} finally {
if (database.inTransaction()) {
database.endTransaction();
}
}
return true;
}
3.调用该方法
Person person = new Person();
person.setName("张三");
person.setSex("男");
person.setAge(15);
person.setPoint(89);
boolean success = dbManager.addPersonData(person);
if (success){
Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,"添加失败",Toast.LENGTH_SHORT).show();
}
五、更新表中已经存在的数据
1.在DBManager中添加更新数据的方法updatePersonData
/**
* 更新表中数据
* @param person
* @return
*/
public boolean updatePersonData(Person person){
try {
ContentValues values = new ContentValues();
values.put("sex", person.getSex());
values.put("age", person.getAge());
values.put("point", person.getPoint());
database.beginTransaction();
database.update("Person", values, "name=?", new String[]{person.getName()});
database.setTransactionSuccessful();
} catch (Exception e) {
return false;
} finally {
if (database.inTransaction()) {
database.endTransaction();
}
}
return true;
}
2.调用该方法
Person person = new Person();
person.setName("张三");
person.setAge(18);
boolean success = dbManager.updatePersonData(person);
if (success){
Toast.makeText(MainActivity.this,"更新成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,"更新失败",Toast.LENGTH_SHORT).show();
}
六、删除表中的数据
1.在DBManager中添加删除数据的方法delByName
/**
* 根据姓名删除Person中的数据
* @param table 表名
* @param whereClause 删除条件
* @param parameter 参数
* @return
*/
public boolean delByName(String table, String whereClause, String[] parameter) {
try {
if (table != "" ) {
database.beginTransaction();
database.delete(table, whereClause, parameter);
database.setTransactionSuccessful();
}
} catch (Exception e) {
return false;
} finally {
if (database.inTransaction()) {
database.endTransaction();
}
}
return true;
}
2.调用该方法
boolean successDel = dbManager.delByName("Person", "name=?", new String[]{"张三"});
if (successDel){
Toast.makeText(MainActivity.this,"更新成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this,"更新失败",Toast.LENGTH_SHORT).show();
}
七、查询表中的数据
1.在DBManager中添加删除数据的方法getPersonByName
/**
* 根据名称查询
* @param name
* @return
*/
public Person getPersonByName(String name) {
Person person = new Person();
try {
String sql = "select * from Person where name=? ";
Cursor cursor = database.rawQuery(sql, new String[]{name});
while (cursor.moveToNext()) {
person.setName(name);
person.setSex(cursor.getString(cursor.getColumnIndex("sex")));
person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
person.setPoint(cursor.getFloat(cursor.getColumnIndex("point")));
}
cursor.close();
} catch (Exception e) {
Log.e("getChatUserById",e.toString());
}
return person;
}
2.调用此方法
Person personQuery = dbManager.getPersonByName("张三");