android-数据库SQLite相关
android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句。
本文将介绍
- android数据库的创建
- 利用sql语句对数据库增删改查
- 系统api数据库增删改查
- 数据库的事务
- 1,数据库的创建
步骤:
- 写一个类继承SQLiteOpenHelper
- 在构造函数中指定 数据库名称,游标工厂, 版本号
- 初始化数据库,执行getWritableDatabase或getReadableDatabase, 创建或打开一个数据库.
-
onCreate里执行SQL创建语句
-
android平台下数据库的创建需要一个辅助类继承SQLiteOpenHelper,并且需要重写父类的构造方法。
-
/** * 数据库创建辅助类 写一个类继承SQLiteOpenHelper * * @author wgk * */ public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { public PersonSQLiteOpenHelper(Context context) { super(context, "PERSON.db", null, 1);//此处是super,直接调用父类的构造方法 } /** * * 构造方法,用于创建一个辅助类,用于打开/创建/管理一个数据库 * * @param context * 上下文 * @param name * 数据库文件的名字 * @param factory * 游标工厂 Cursor 游标(指针), 本身并不存储数据. 保存数据库的引用. * @param version * 数据库版本 */ public PersonSQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override // 数据库第一次被创建时调用,适合初始化操作 public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL("create table person (" + " _id integer primary key autoincrement, " + " name varchar(20), " + " age integer);"); } @Override // 数据库更新时调用这个方法 // 用于执行表的更新操作 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
这个类仅仅是一个辅助类,若想使用数据库,还需要创建一个数据库访问类PersonDAO。
-
2,对数据库进行增删改查
-
public class PersonDAO{ private final Context context; private PersonSQLiteOpenHelper helper; public PersonDAO(Context context) { this.context = context; helper = new PersonSQLiteOpenHelper(context); } /** * @param name * @param age */ public void add(String name, int age) { SQLiteDatabase db = helper.getWritableDatabase(); // db.execSQL("insert into person (name,age) values ('"+name+"',"+age+")"); // 防止SQL注入 db.execSQL("insert into person (name,values) values(?,?)", new Object[] { name, age }); } /** * 根据名字删除一条数据 * * @param name */ public void delete(String name) { SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from person where name=?", new Object[] { name }); } //根据名字更新年龄
public void update(int age, String name) { SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set age=? where name=?", new Object[] { age,name }); } public void querySingleRecord(String nameStr) { SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * from person where name=?",new String[] { nameStr }); if (cursor != null && cursor.moveToFirst()) { String _id = cursor.getString(0); String name = cursor.getString(1); String age = cursor.getString(2); System.out.println("_id: " + _id); System.out.println("name: " + name); System.out.println("age: " + age); cursor.close(); } } /** * 查询所有数据 */ public void queryAll() { SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * form person", null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); System.out.println("_id: " + _id); System.out.println("name: " + name); System.out.println("age: " + age); System.out.println("-----------------"); } cursor.close(); } } }
-
注意:在获得数据库辅助类对象时,此时并未创建数据库,只有在辅助类对象调用getxxxxDatabase方法(创建可读或者可写的数据库)时,才创建数据库。
-
//此时并未创建数据可 PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext()); // 获取一个可读/可写的数据库, 真正创建了数据库 helper.getWritableDatabase();
-
除了使用SQL语句来进行增删改查,还可以使用google提供的api。
//主要语句
// 增 db.insert("person", "name", values); // 删 db.delete("person", "name=?", new String[]{name}); // 改 db.update("person", values, "name=?", new String[]{name}); //查 Cursor cursor = db.query("person", // 表名 null, // 要查询列名 new String[]{name,age} "name = ?", // 查询条件 new String[]{nameStr},// 条件参数 null, // 分组 null, // 分组 null); // 排序
使用google的api对PersonDAO进行修改,如下
/** * 使用google提供的api来操作数据库 * * 数据库访问对象 * @author wgk * */ public class PersonDAO3 { private final Context context; private PersonSQLiteOpenHelper helper; public PersonDAO3(Context context){ this.context=context; helper=new PersonSQLiteOpenHelper(context); } /** * 增加一条数据 * @param name * @param age */ public void add(String name,int age){ SQLiteDatabase db=helper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("name", name); values.put("age", age); //若需要插入一条空的数据,需要指定任意一个列的名称,以避免异常 String nullColumnHack="null"; long insert=db.insert("person", nullColumnHack, values); System.out.println(insert); } /** * 删除一条数据根据名字 * @param name */ public void delete(String name){ SQLiteDatabase db=helper.getWritableDatabase(); int delete=db.delete("person", "name=?", new String[]{name}); System.out.println(delete); } /** * 更新年龄!根据名字 * @param age * @param name */ public void update(int age,String name){ SQLiteDatabase db=helper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("age", age); int update =db.update("person", values, "name=?", new String[]{name}); System.out.println(update); } /** * 查!根据一个人的名字 * @param name */ public void querySingleRecord(String nameStr){ SQLiteDatabase db=helper.getReadableDatabase(); Cursor cursor=db.query("person", null,//列名 "name=?",//查询条件 new String[]{nameStr},//查询参数 null, //分组 null,//分组 null);//排序 if(cursor!=null&&cursor.moveToFirst()){ String _id=cursor.getString(0); String name=cursor.getString(1); String age=cursor.getString(2); System.out.println("_id: " + _id); System.out.println("name: " + name); System.out.println("age: " + age); //关闭cursor //关闭cursor //关闭cursor cursor.close(); } } /** * 查询所有数据 */ public void queryAll(){ SQLiteDatabase db=helper.getReadableDatabase(); Cursor cursor=db.query("person", null, null, null, null, null, "_id DESC");//排序 if(cursor!=null&&cursor.getCount()>0){ while(cursor.moveToNext()){ int _id=cursor.getInt(cursor.getColumnIndex("_id")); String name=cursor.getString(cursor.getColumnIndex("name")); int age=cursor.getInt(cursor.getColumnIndex("age")); System.out.println("_id: " + _id); System.out.println("name: " + name); System.out.println("age: " + age);
} //关闭cursor //关闭cursor //关闭cursor cursor.close(); } } }
两种方式的比较
1.利用SQL语句进行增删改查
优点:灵活, 根据需要进行表的级联查询.缺点:容易出错. 没有返回值
2.利用系统API增删改查
优点:不容易出错. 有返回值
缺点:不灵活, 效率稍低, 拼接sql语句耗时
-------------------------------------------------我是分割线-------------------------------------------------
数据库的事务(Transaction)
-
(安全性)银行转账:
- 转出,laowang 账户10000 -> 转出1000 ->
- 转入,xiaosan 账户 0 收到1000
-
(高效性)数据的插入:
-
- 提高数据库操作效率, 大约提升6倍速度
- 打开一次数据,
以laowang给xiaosan转账1000的例子写一段demo如下
public class TransactionDemo extends AndroidTestCase{ public void transactionDemo(){ PersonSQLiteOpenHelper helper= new PersonSQLiteOpenHelper(getContext()); //此时才真正创建数据库 SQLiteDatabase db=helper.getWritableDatabase(); try{ //开始事务 db.beginTransaction(); //转出1000 db.execSQL("update person set money=money-1000 where name=?", new Object[]{"laowang"}); //在执行至回滚点之前,并不会对数据库进行真的操作,一切都在内存中进行,只有执行到回滚点之后,才会影响到数据库 //int i =1/0; //转入1000 db.execSQL("update person set money=money+1000 where name=?", new Object[]{"xiaosan"}); //设置回滚点 db.setTransactionSuccessful(); }catch (Exception e){ e.printStackTrace(); }finally{ db.endTransaction(); } }
总结:
-------------------------------------------------基础要像磐石!!!
-
温故而知新