Android轻量级数据库SQLite
简介
android开发app难免要存储一些数据到本地,作为缓存,这就要用到安卓系统的SQLite
数据库用于存储数据,数据以文档的形式存到本地外部存储空间。
SQLite与mySQL存储方式差别不大,都是以表格的形式存储。
存下来的表格可以在手机外存中查看。
把user.db文件导出到电脑,就可以查看其中的内容了,需要下载一个SQLite Expert Professional软件查看,把xxx.db拖拽进入就可以查看了。
SQLiteOpenHelper类
SQLite数据库用SQLiteOpenHelper类来应用,创建一个Helper继承它,继承后需要实现两个抽象方法onCreate()与onUpgrade()方法,第一个方法就是在第一次创建xxx.db文件的时候调用,第二个方法是版本更新的时候调用。
构造方法需要传递一个上下文,表名,版本号。其中版本号一定要大于等于1。
public class Helper extends SQLiteOpenHelper {
// context上下文 name datebase名 factory游标工厂 version版本
public Helper(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 第一次创建文件时执行
long deatTime = System.currentTimeMillis() + 1 * 60 * 60 * 1000;
System.out.println("onCreate执行");
db.execSQL("create table user(_id integer primary key autoincrement,"
+ "name varchar(20),tel varcher(20),deadTime varchar(50))");
db.execSQL("insert into user(name,tel,deadTime) values(?,?,?)",
new String[] { "张三", "110", deatTime + "" });
db.execSQL("insert into user(name,tel,deadTime) values(?,?,?)",
new String[] { "李四", "120", deatTime + "" });
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 更新版本时执行
}
}
创建一个Dao包,写一个接口Dao,两个实现子类Dao1与Dao2用于测试两种调用数据库的方法。
Dao接口
public interface Dao {
public abstract void insert();
public abstract void delete();
public abstract void update();
public abstract void select();
public abstract List<User> selectList();
}
Dao1实现子类(sql语言实现)
构造方法获取一个SQLiteOpenHelper类或者其子类,然后就可以实现接口中的增删查改方法了。
public void insert() {
SQLiteDatabase db = helper.getWritableDatabase();
long deadTime = System.currentTimeMillis() + 1 * 60 * 60 * 1000;
String sql = "insert into user(name,tel,deadTime) values(?,?,?)";
Object[] bindObjects = new String[] { "王五", "111111", deadTime + "" };
db.execSQL(sql, bindObjects);
db.close();
}
@Override
public void delete() {
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "delete from user where name=?";
Object[] bindObjects = new String[] { "王五" };
db.execSQL(sql, bindObjects);
db.close();
}
@Override
public void update() {
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "update user set tel='999999' where name=? ";
Object[] objects = new String[] { "王五" };
db.execSQL(sql, objects);
db.close();
}
@Override
public void select() {
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "select name,tel,deadTime from user where name=?";
String[] bindStrings = new String[] { "王五" };
Cursor cursor = db.rawQuery(sql, bindStrings);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String tel = cursor.getString(1);
String deadTime = cursor.getString(2);
System.out.println(name + ":" + tel + ":" + deadTime);
}
cursor.close();
}
db.close();
}
Dao2实现(ContentValues与SQLiteOpenHelper)
这是一种调用数据库的方式,还有一种方式是直接应用ContentValues类来传递map类型的数值给数据库,实现操控数据库。
写在Dao2实现子类中
public void insert() {
long deadTime = System.currentTimeMillis() + 1 * 60 * 1000;
SQLiteDatabase db = helper.getReadableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", "王五");
contentValues.put("tel", "222222");
contentValues.put("deadTime", "" + deadTime);
long result = db.insert("user", null, contentValues);
if (result == -1) {
System.out.println("失败");
} else {
System.out.println("成功");
}
db.close();
}
@Override
public void delete() {
SQLiteDatabase db = helper.getWritableDatabase();
String[] whereArgStrings = { "王五" };
int delete = db.delete("user", "name=?", whereArgStrings);
System.out.println(delete);
db.close();
}
@Override
public void update() {
SQLiteDatabase db = helper.getWritableDatabase();
String[] whereArgString = { "王五" };
ContentValues contentValues = new ContentValues();
contentValues.put("tel", "888888");
int update = db.update("user", contentValues, "name=?", whereArgString);
System.out.println(update);
db.close();
}
@Override
public void select() {
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "selete name,tel,deadTime from user where";
String[] columnStrings = { "name", "tel", "deadTime" };
String selection = "name=?";
String[] whereArg = { "王五" };
Cursor cursor = db.query("user", columnStrings, selection, whereArg,
null, null, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String tel = cursor.getString(1);
String deatTime = cursor.getString(2);
System.out.println(name + ":" + tel + ":" + deatTime);
}
cursor.close();
}
db.close();
}
在MainActivity的onCreate()方法中创建一个Helper类的对象、Dao1或者Dao2的对象就可以实现SQLite数据库的增删查改操作了。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Helper helper = new Helper(this);
dao = new Dao2(helper);
Dao2结果图示
Dao2的图示结果,Dao2应用到ContentValues与SQLiteOpenHelper的结合,效果要比Dao1实现的方式要好,因为它有返回值,会返回受影响的数据行数,出现异常还会返回-1,极大的增强了程序的容错性。