首先来简单介绍下Android的数据库SQLite,是一个支持SQL的轻量级的嵌入式数据库。
SQLiteDatabase:Android数据库中使用最多的一个类,通过它可以实现数据库的创建、打开,new一个新表,实现增删改查。每次用完之后要记得将数据库close掉。
SQLiteOpenHelper:是一个抽象类,通常定义一个类来继承它,实现onCreate,onUpdate,onOpen方法。
Cursor:游标的意思,可以在数据库操作中像游标箭头一样移动指向的对象。
下面以一个Person表为例(包含姓名、电话)实现数据库的增删改查。
1.先给出一些数据库操作的示例语句:
添加:insert into person (name,number) values ('zhangsan','110')
查询全部:select * from person
查询具体条目:select * from person where name = 'zhangsan'
修改条目:update person set number = '119' where name = 'zhangsan'
删除一条记录;delete from person where name = 'zhangsan'
查询具体条目:select * from person where name = 'zhangsan'
修改条目:update person set number = '119' where name = 'zhangsan'
删除一条记录;delete from person where name = 'zhangsan'
2.下面是Android示例代码,其中被注释掉的是需要我们自己来写数据库操作语句的实现方法,另一种方法是Android自带的API,其实就是在Android中将数据库操作的语句封装好了,直接提供方法来让我们使用,推荐大家使用第二种方法。
private PersonSQLiteOpenHelper helper;
//在构造方法里面完成helper的初始化
public PersonDao2(Context context){
helper = new PersonSQLiteOpenHelper(context);
}
/**
* 添加一条记录到数据库
* @param name 姓名
* @param number 电话
*/
public long add(String name,String number){
SQLiteDatabase db = helper.getWritableDatabase();
// db.execSQL("insert into person (name,number) valuse (?,?)", new Object[]{name,number});
ContentValues values = new ContentValues();
values.put("name", name);
values.put("number", number);
long id = db.insert("person", null, values);
db.close();
return id;
}
/**
* 查询记录是否存在
* @param name 姓名
* @return true 存在 false 不存在
*/
public boolean find(String name){
SQLiteDatabase db = helper.getReadableDatabase();
// Cursor cursor = db.rawQuery("select * from person where name =?", new String[]{name});
Cursor cursor = db.query("person", null, "name=?", new String[]{name}, null, null, null);
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
}
/**
* 修改一条记录
* @param name 要修改的人的姓名
* @param newnumber 新的号码
*/
public int update(String newname,String newnumber){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("update person set number=? where name =?", new Object[]{newname,newnumber});
ContentValues values = new ContentValues();
values.put("number", newnumber);
int number = db.update("person", values, "name=?", new String[]{newnumber});
db.close();
return number;
}
/**
* 删除一条记录
* @param name
*/
public int delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("delete from person where name =?", new Object[]{name});
int number = db.delete("person", "name =?", new String[]{name});
db.close();
return number;
}
/**
* 返回全部的数据库信息
* @return
*/
public List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
List<Person> persons = new ArrayList<Person>();
//Cursor cursor = db.rawQuery("select name,id,number from person", null);
Cursor cursor = db.query("person", new String[]{"name","id","number"}, null, null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id,name,number);
persons.add(p);
}
cursor.close();
db.close();
return persons;
}
那么问题来了,我们实现了上面的代码后,在data目录里生成好了文件那我们如何获取到呢?
有些时候dota目录的权限不够,我们无法打开,所以下面给大家分享一种通过命令行的方式来获取data/data里的数据文件
Android数据库创建后查询数据文件的cmd指令
1.adb shell
2.cd data/data/com.example.db/database/
3.sqlite3 person.db
4.写数据库执行语句
1.adb shell
2.cd data/data/com.example.db/database/
3.sqlite3 person.db
4.写数据库执行语句
最后来和大家谈一下数据库的事务
那什么是事务呢?
举个简单的栗子:甲需要给乙汇款1000,这个过程要分两步,甲先将汇款打到汇款机里,得到数据后,然后数据再传输到乙的账户上,但是我们假设这样一种情况,甲打了钱后,这哥们运气特别好,刚好断电了,那乙就收不到钱了,但是事实上是不允许这样的事发生的,所以两件事必须的同时发生同时结束,这就是事务。下面简单给出事务过程代码
//开始数据库的事务
db.beginTransaction();
//标记数据库事务执行成功
db.setTransactionSuccessful();
//结束数据库的事务
db.endTransaction();
db.beginTransaction();
//标记数据库事务执行成功
db.setTransactionSuccessful();
//结束数据库的事务
db.endTransaction();