Android中数据持久化方案之一:javabean和Dao模式

作者: 陈利健 | 来源:发表于2016-04-20 13:05 被阅读1150次

    数据库是Android 数据持久化操作的解决方案之一。
    以保存User信息为例,需要用到3个类:

    • UserBean

    JavaBean是最标准的POJO,里面有一个无参构造方法、纯粹的get/set方法、实现Serializable接口可序列化,没有业务逻辑。

    • UserDB

    即SQL语句操作

    • UserDBDao

    DAO提供了和数据库打交互的方法,这里通常写获取连接、关闭连接、增删改查的方法。

    总结:

    • user信息实际上是一张user表。
    • javabean是一个包含属性和表中字段完全对应的类。并在该类中提供set和get方法来设置并获得该类中的属性。一个javabean类与一个数据库中的表相对应,也就是说,有多少表,就应该有多少javabean类。而实例化的javabean对象则代表一个表中的一行数据。
    • Dao实现类通过连接数据库进行数据库操作。一个Dao实现类对应一个表,如UserDBDao类对应user表,该类中将定义对该表的所有的操作。

    例子:

    public class UserBean{
        private String name;
        private String pass;
        private String userID;
        private boolean infoCompleted;
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }
        public String getPass(){
            return pass;
        }
        public void setPass(String pass){
            this.pass = pass;
        }
        public String getUserID(){
            return userID;
        }
        public void setUserID(String userID){
            this.userID = userID;
        }
        public boolean isInfoCompleted(){
            return infoCompleted;
        }
        public void setInfoCompleted(boolean infoCompleted){
            this.infoCompleted = infoCompleted;
        }   
    }
    

    public class UserDB extends SQLiteOpenHelper{
        private static final String DB_NAME = "test";
        private static final int version = 1;
        public String TABLE_NAME_USER = "users";
        private String CREATE_TABLE_USER = "create table if not exists "
                + TABLE_NAME_USER
                + "(_id integer primary key autoincrement," +
                "userid varchar(30),name varchar(30),pass varchar(30), is_complete int);";
        
        public UserDB(Context context) {
            super(context, DB_NAME, null, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL(CREATE_TABLE_USER); 
        }
        
        @Override
        public void onOpen(SQLiteDatabase db){
            db.execSQL(CREATE_TABLE_USER);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2){
    
        }
    }
    

    public class UserDBDao{
    
        private UserDB helper;
    
        public UserDBDao(Context context) {
            helper = new UserDB(context);
        }
    
        /**
         * 添加用户
         */
        public long add(UserBean user){
            if (isUserExist(user.getUserID())) { return -1; }
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("userid", user.getUserID());
            values.put("name", user.getName());
            values.put("pass", user.getPass());
            values.put("is_complete", user.isInfoCompleted()?1:0);
            long rowID = db.insert(helper.TABLE_NAME_USER, null, values);
            db.close();
            return rowID;
        }
    
        /**
         * 查询某个用户是否存在
         */
        public boolean isUserExist(String userid){
            boolean result = false;
            SQLiteDatabase db = helper.getWritableDatabase();
            Cursor cursor = db.query(helper.TABLE_NAME_USER, null, "userid=?",
                                        new String[] { userid }, null, null, null);
            if (cursor.moveToNext()){
                result = true;
            }
            cursor.close();
            db.close();
            return result;
        }
    
        /**
         * 查询某个用户
         */
        public UserBean getUser(String userid){
            if (!CommonUtil.isNotEmpty(userid)) { return null; }
            UserBean bean = new UserBean();
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query(helper.TABLE_NAME_USER, new String[] { "name", "pass", "is_complete" }, "userid=?", new String[] { userid }, null, null, null);
            if (cursor.moveToNext()){
                bean.setName(cursor.getString(0));
                bean.setPass(cursor.getString(1));
                bean.setInfoCompleted(cursor.getInt(2) == 0);
            }
            cursor.close();
            db.close();
            return bean;
        }
    
        /**
         * 返回所有的用户信息
         */
        public List<UserBean> findAllUser(){
            List<UserBean> allUsers = new ArrayList<UserBean>();
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.query(helper.TABLE_NAME_USER, new String[] { "userid", "name", "pass", "is_complete" }, null, null, null, null, null);
            while (cursor.moveToNext()){
                UserBean bean = new UserBean();
                bean.setUserID(cursor.getString(0));
                bean.setName(cursor.getString(1));
                bean.setPass(cursor.getString(2));
                bean.setInfoCompleted(cursor.getInt(3) == 0);
                allUsers.add(bean);
            }
            cursor.close();
            db.close();
            return allUsers;
        }
    
        /**
         * 删除一条用户的记录
         */
        public boolean delete(String userId){
            SQLiteDatabase db = helper.getWritableDatabase();
            int result = db.delete(helper.TABLE_NAME_USER, "userid=?", new String[] { userId });
            db.close();
            if (result > 0){
                return true;
            }
            else{
                return false;
            }
        }
    
        /**
         * 修改密码
         */
        public boolean updatePass(String userid, String pass){
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("pass", pass);
            int result = db.update(helper.TABLE_NAME_USER, values, "userid=?", new String[] { userid });
            db.close();
            if (result > 0){
                return true;
            }
            else{
                return false;
            }
        }
    }
    

    以上。
    UserDBDao提供了对外操作数据的方法,外部只需要通过UserDBDao对象来对数据进行存取及其他操作即可。
    如果你以前习惯用sharedpreferences来进行数据持久化操作的话,UserDBDao在某些方面也可以等价于其功能。
    与sharedpreferences不同的是,sharedpreferences常用于轻量级的、单个类型的数据存取,而DBDao则更倾向于整张表结构数据的存取操作。

    相关文章

      网友评论

        本文标题:Android中数据持久化方案之一:javabean和Dao模式

        本文链接:https://www.haomeiwen.com/subject/xomzlttx.html