sqlite数据库 是一个开源项目,是一个轻量的关系型数据库。
如何使用它呢,创建它的代码如下。
首先创建一个DBOpenHelper的类,继承SQLiteOpenHelper。
public class MyDBOpenHelper extends SQLiteOpenHelper {
/**
*
* @param context 应用程序上下文
* @param name 数据库的名字
* @param factory 查询数据库的游标工厂 一般情况下 用sdk默认的
* @param version 数据库的版本 版本号必须不小1
*
*/
public DBOpenHelper(Context context) {
super(context, "test.db", null, 5);
}
// 在dbOpenHelper 在数据库第一次被创建的时候 会执行onCreate();
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("我被调用了 oncreate");
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("on update ");
db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");
}
}
onCreate只会在数据库第一次创建的时候被执行。
onUpdate方法在数据可版本Version变化是被执行,用语跟新表。
这句代码就会在test.db中创建一张表TABLE.
db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");
在Activity中,使用getReadableDatabase就可得到一个可读的数据库了。
DBHelper db=new DBHelper(this);
db.getReadableDatabase();
关于数据库的增删该查
public class PersonDAO {
private DBHelper helper;
public PersonDAO(Context context) {
helper = new DBHelper(context);
}
/**
* 增加一条记录
* */
public void add(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
/* db.execSQL("insert into person (name) values("+name+")");//写法一 */
db.execSQL("insert into person (name) values (?)",
new Object[] { name });// 写法二
db.close();
}
}
/**
* 查找一条记录
* */
public boolean find(String name) {
boolean result = false;
SQLiteDatabase db = helper.getReadableDatabase();
if (db.isOpen()) {
Cursor cursor = db.rawQuery("select * from person where name=?",
new String[] { name });
if (cursor.moveToFirst()) {// 如果游标能够移动到第一位
int index = cursor.getColumnIndex("personid");// 得到name在表中是第几列
String id = cursor.getString(index);
Log.i("TAG", name + "的ID是" + id);
result = true;
// 记得关闭掉cursor
cursor.close();
}
result = false;
db.close();
}
return result;
}
/***
* 删除一条记录
*
* @param name
*/
public void delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
db.execSQL("delete from person where name=?", new Object[] { name });
db.close();
}
}
/**
* 跟新一条数据
* */
public boolean update(String oldName, String newName) {
SQLiteDatabase db = helper.getWritableDatabase();
if (db.isOpen()) {
db.execSQL("update person set name=? where name=?", new Object[] {
newName, oldName });
db.close();
return true;
}
return false;
}
}
在Activity中,只要
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PersonDAO personDAO=new PersonDAO(this);
personDAO.add("张三");
}
}
也可以使用自带的API来操作数据库,这样不用自己写sql语句。
public class PersonDBDao {
private Context context;
MyDBOpenHelper dbOpenHelper;
public PersonDBDao(Context context) {
this.context = context;
dbOpenHelper = new MyDBOpenHelper(context);
}
/**
* 添加一条记录
*/
public void add(String name, int age) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
// db.execSQL("insert into person (name,age) values (?,?)",new
// Object[]{name,age});
// db.execSQL("insert into person ",null) // 不合法的sql语句
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
// 如果 contentvalues为空
db.insert("person", null, values); // 组拼sql语句完成的添加的操作
//第二个参数null的意义:如果values为空则执行 insert into person name values (NULL) ;
db.close();
}
}
/**
* 删除一条记录
*/
public void delete(String name) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
db.delete("person", "name=?", new String[] { name });
db.close();
}
}
/**
* 数据库的更改操作
*/
public void update(String name, String newname, int newage) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
ContentValues values = new ContentValues();
values.put("name", newname);
values.put("age", newage);
db.update("person", values, "name=?", new String[] { name });
db.close();
}
}
/**
* 数据库的查询操作
*/
public boolean find(String name) {
boolean result = false;
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
// select * from person
Cursor cursor = db.query("person", null, "name=?",
new String[] { name }, null, null, null);
if (cursor.moveToFirst()) {
result = true;
}
cursor.close();
db.close();
}
return result;
}
/**
* 查询所有信息
*/
public List<Person> findAll() {
List<Person> persons = null;
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
Cursor cursor = db.query("person", null, null, null, null, null,
null);
persons = new ArrayList<Person>();
while (cursor.moveToNext()) {
Person person = new Person();
String name = cursor.getString(cursor.getColumnIndex("name"));
person.setName(name);
int age = cursor.getInt(cursor.getColumnIndex("age"));
person.setAge(age);
persons.add(person);
}
cursor.close();
db.close();
}
return persons;
}
/**
* 查询所有信息
*/
public Cursor findAllbyCursor() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
if (db.isOpen()) {
/*Cursor cursor = db.query("person", null, null, null, null, null,
null);*/
Cursor cursor = db.rawQuery("select personid as _id,age,name from person", null);
return cursor;
// 注意了 一定不要把数据库 关闭了
}
return null;
}}
涉及到事务的操作,用一下例子来说明:
/**
* 银行转账的方法
*/
public void transaction() {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
if (db.isOpen()) {
try {
// 开启数据库的事务
db.beginTransaction();
// 给张三设置1000块钱的账户
db.execSQL("update person set account=? where name=?",
new Object[] { 1000, "zhangsan98" });
// 把张三的账户扣除200块钱
db.execSQL("update person set account=account-? where name=?",
new Object[] { 200, "zhangsan98" });
// 出现了异常
// 把张三的钱给李四
//初始化李四账户 为 0
db.execSQL("update person set account=? where name=?",
new Object[] { 0, "lisi" });
db.execSQL("update person set account=account+? where name=?",
new Object[] { 200, "lisi" });
db.setTransactionSuccessful();
}
// 显示的设置事务是否成功
catch (Exception e) {
// TODO: handle exception
} finally {
db.endTransaction();
db.close();
}
}
}