一、使用sql语句进行增删改查等操作
1、自定义一个类,继承sqliteOpenHelper类,用来创建和更新数据库。
<span style="font-size:18px;">public class MysqLiteHelper extends sqliteOpenHelper { /** * * @param context * @param name 数据库名字 * @param factory 游标工厂 * @param version 数据库版本 */ public MysqLiteHelper(Context context,String name,CursorFactory factory,int version) { super(context,name,factory,version); } //第一次连接数据库时,如果数据库不存在,则调用该方法。如果已存在,则不调用。 @Override public void onCreate(sqliteDatabase db) { //通过sql语句建表,表名是person,该表中有三个字段。_id是自增加的ID,name是varchar类型, //age是integer类型 String sql = "Create table person(_id integer primary key autoincrement," + "name varchar(20),age integer);"; db.execsql(sql); } //当数据库的版本发生变化时,回调该方法。因此该方法一般用来处理数据库的升级,包括建表 删表 增加字段等 @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { if(oldVersion == 1 && newVersion == 2){ //建新的表 String sql = "Create table if not exists hello(_id integer primary key autoincrement," + "name varchar(20),age integer);"; db.execsql(sql); } else if(oldVersion == 2 && newVersion == 3){ //增加字段 String sql = "Alter table person add balance integer;"; db.execsql(sql); }else if(oldVersion == 3 && newVersion == 4){ //删除表 String sql = "Drop table hello;"; db.execsql(sql); } } }</span>
2、增删改查操作。
<span style="font-size:18px;">public class sqliteOperator { private MysqLiteHelper MysqLiteHelper; public sqliteOperator(Context context) { MysqLiteHelper = new MysqLiteHelper(context,"test.db",null,1); // 调用该方法后,会连接数据库,如果数据库不存在就会调用onCreate方法 MysqLiteHelper.getReadableDatabase(); } //增加数据操作 public void insert(Person p) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); if (db.isOpen()) { //值是通过占位符?来处理 String sql = "insert into person(name,age) values(?,?);"; db.execsql(sql,new Object[] { p.getName(),p.getAge() }); db.close(); } } //删除操作 public void delete(String name) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); if (db.isOpen()) { String sql = "delete from person where name = ?;"; db.execsql(sql,new String[] { name }); db.close(); } } //更新数据操作 public void update(int id,String name) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); if (db.isOpen()) { String sql = "update person set name = ? where _id = ?;"; db.execsql(sql,new Object[] { name,id }); db.close(); } } //查询全部数据 public List<Person> queryAll() { sqliteDatabase db = MysqLiteHelper.getReadableDatabase(); if (db.isOpen()) { String sql = "select * from person;"; Cursor rawQuery = db.rawQuery(sql,null); List<Person> personList = new ArrayList<Person>(); if (rawQuery != null && rawQuery.getCount() > 0) { int id = 0; String name = null; int age = 0; while (rawQuery.moveToNext()) { id = rawQuery.getInt(0); name = rawQuery.getString(1); age = rawQuery.getInt(2); personList.add(new Person(id,age)); } db.close(); return personList; } db.close(); } return null; } //查询一条数据 public Person queryItem(String name){ sqliteDatabase db = MysqLiteHelper.getReadableDatabase(); if (db.isOpen()) { //查询名字是xxx的数据,得到其中的name和age字段。 String sql = "select name,age from person where name = ?;"; Cursor rawQuery = db.rawQuery(sql,new String[]{name}); int id = 0; String _name = null; int age = 0; if(rawQuery != null && rawQuery.moveToFirst()){ //由于得到的是name和age字段,所以下标0是表示name的值,下标1是age的值。 _name = rawQuery.getString(0); age = rawQuery.getInt(1); db.close(); return new Person(id,_name,age); } db.close(); } return null; } }</span>
二、通过Android的API方式进行增删改查操作。
1、自定义一个类,继承sqliteOpenHelper类,用来创建和更新数据库。和上面的第一点是一样的。
2、增删改查操作。
<span style="font-size:18px;">// 增加数据操作 public void insert(Person p) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); if (db.isOpen()) { ContentValues values = new ContentValues(); //插入一条新数据,根据键和值 values.put("name",p.getName()); values.put("age",p.getAge()); db.insert("person",values); db.close(); } } //删除操作 public void delete(String name) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); if (db.isOpen()) { //删除名字=name的行。 db.delete("person","name = ?",String name) { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name",name); if (db.isOpen()) { //values是要修改的值。_id是条件 db.update("person",values,"_id = ?",new String[] { id + "" }); db.close(); } } //查询全部 public List<Person> queryAll() { sqliteDatabase db = MysqLiteHelper.getReadableDatabase(); if (db.isOpen()) { //查询全部,得到字段是name和age的全部列 Cursor cursor = db.query("person",new String[] { "name","age" },null); if (cursor != null && cursor.getCount() > 0) { List<Person> personList = new ArrayList<Person>(); while (cursor.moveToNext()) { String name = cursor.getString(0); int age = cursor.getInt(1); personList.add(new Person(1,age)); } db.close(); return personList; } db.close(); } return null; } //查询一条数据 public Person queryItem(String name) { sqliteDatabase db = MysqLiteHelper.getReadableDatabase(); if (db.isOpen()) { Cursor cursor = db.query("person",new String[] { name },null); if (cursor != null && cursor.moveToFirst()) { String mName = cursor.getString(0); int age = cursor.getInt(1); db.close(); return new Person(2,mName,age); } db.close(); } return null; }</span>
三、事务操作API。
情景一:A向B汇钱,A的账户钱扣掉后,ATM死机了,这时B的账号也没有执行余额增加,就会出现问题。事务操作可以避免这种情况的发生。
<span style="font-size:18px;">private void testTransaction() { sqliteDatabase db = MysqLiteHelper.getWritableDatabase(); //开始事务操作 db.beginTransaction(); try { db.execsql("update person set balance = balance - 100 where name = 'zhangsan'"); //出异常 db.execsql("update person set balance = balance + 100 where name = 'lisi'"); //标记事务操作成功 db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { //结束事务操作 db.endTransaction(); } }</span>
开始事务操作后,此时执行第一条sql语句是预执行,然后出现异常,此时就会跳到catch里而并没有预执行第二条sql语句。然后接着执行finally里的语句,结束事务操作。当事务结束操作时发现,自己的标志位没有标记成功,那么第一条sql也不会被真正地执行。只有当结束事务操作时,发现setTransactionSuccessful()才会认为此次操作是成功的,那么就会把之前预执行的sql语句真正执行。
情景二:假如向数据库中新增加10000条数据,如果用直接使用for循环就会非常地慢,每一次都要打开数据库,插入数据。而如果使用上面的事务操作,那么效率就会大大的提高,因为for循环10000次都是预操作,等最后标记位成功了,才打开数据库,真正插入这些数据。节省下来的就是打开数据库的时间。
四、sqlite3工具使用
命令行输入adb shell
进入到应用程序数据库存放的位置 /data/data/包名/databases 目录下
select * from person; 查看数据库全部数据