android-数据库SQLite相干

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();
     
    3,使用goole的api操作数据库
  • 除了使用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)

    1. (安全性)银行转账:

      • 转出,laowang 账户10000 -> 转出1000 ->
      • 转入,xiaosan 账户 0 收到1000
    2. (高效性)数据的插入:

    • 提高数据库操作效率, 大约提升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();
                
            }
        }

     

    总结:

    最近都是在下班之后才有时间写写blog。现在只是把以前的笔记稍加整理,可能有些知识点说得不精确,有些策略没有做到最优,这是由于当时学习时没有认识到。我并没有刻意拣出来,恳请大家一起指正。

    我要去玩梦幻了,hiahiahiahiahia~~~

    -------------------------------------------------基础要像磐石!!!