android框架搭建——封装一个属于自己的数据存储工具类(SQLite篇)

当我们缓存本地的数据存在一对多(一个name对应多个values)的情况时,sharedPreferences已经无法胜任存储的工作了。此时我们需要使用SQLite来进行本地缓存。
直接使用SQlite进行存储时,每次执行插入,查询,删除操作都要写一大堆代码,很麻烦,所以我们对SQLite进行一下简单的封装,下面给出例子:
在这个例子中,我们要存储同学的姓名,年龄,指导老师,家庭地址,手机号等数据。

步骤一:创建SQLiteOpenHelper类,用于建表操作:

DBHelper.java:

public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "student.db";
    private static final int version = 1;
    private static final String SQL_CREATE = "create table student_info(_id integer primary key autoincrement,student_id integer,name text,age integer,teacher text,address text,phone long)";
    private static final String SQL_DROP = "drop table if exists student_info";

    public DBHelper(Context context) {
        super(context, DB_NAME, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SQL_DROP);
        db.execSQL(SQL_CREATE);
    }
}
步骤二:写一个学生信息的bean:

studentInfo.java:

public class SudentInfo {
	private int id;
	private String name;
	private int age;
	private String teacher;
	private String address;
	private long phone;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getTeacher() {
		return teacher;
	}

	public void setTeacher(String teacher) {
		this.teacher = teacher;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public long getPhone() {
		return phone;
	}

	public void setPhone(long phone) {
		this.phone = phone;
	}

}
步骤三:写一个增删改查的接口:

StudentDAO.java:

/**数据访问接口
 * Created by 95 on 2015/10/21.
 */
public interface StudentDAO {
    /**
     * 插入学生信息
     */
public void insertStudent(StudentInfo studentInfo);

    /**
     * 删除学生
     */
    public void deleteStudent(String name);

    /**
     * 更新学生
     */
    public void updateThread(String name);

    /**
     * 查询学生信息(同一老师对应多个学生)
     */
    public List<StudentInfo> getStudents(String teacher);
    /*
     * 查询学生信息(一个名字对应一个学生)
     */
    public StudentInfo getStudent(String name);

    /**\
     * 学生信息是否存在
     * @return
     */
    public boolean isExists(String name);
}

步骤四:写一个实现增删改查接口的类:

/**
 * 数据访问接口实现
 * Created by 95 on 2015/10/21.
 */

public class StudentDAOImpl implements StudentDAO {
    private DBHelper mHelpter = null;

    public StudentDAOImpl(Context context) {
        mHelpter = new DBHelper(context);
    }

    @Override
    public void insertStudent(StudentInfo studentInfo) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        db.execSQL("insert into student_info(student_id,name,age,teacher,adderess,phone) values(?,?,?,?,?,?)",
                new Object[]{studentInfo.getId(), studentInfo.getName(), studentInfo.getAge(), studentInfo.getTeacher(), studentInfo.getAddress(),studentInfo.getPhone()});
        db.close();
    }

    @Override
    public void deleteStudent(String name) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        db.execSQL("delete from student_info where name = ? ",
                new Object[]{name});
        db.close();
    }

    @Override
    public void updateStudent(String name,int age,String teacher,String address,long phone) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        db.execSQL("update student_info set age = ?,teacher = ?,adderess = ?,phone = ? where name = ?",
                new Object[]{age,teacher,address,phone,name});
        db.close();
    }

    @Override
    public List<StudentInfo> getStudents(String teacher) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        List<StudentInfo> list = new ArrayList<StudentInfo>();
        Cursor c = db.rawQuery("select * from student_info where teacher = ?", new String[]{teacher});
        while (c.moveToNext()) {
        	StudentInfo student = new StudentInfo();
        	student.setId(c.getInt(c.getColumnIndex("student_id")));
        	student.setName(c.getString(c.getColumnIndex("name")));
        	student.setAge(c.getInt(c.getColumnIndex("age")));
        	student.setAddress(c.getString(c.getColumnIndex("address")));
        	student.setPhone(c.getLong(c.getColumnIndex("phone")));
            list.add(student);
        }
        c.close();
        db.close();

        return list;
    }
    @Override
    public StudentInfo getStudent(String name) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        StudentInfo student = new StudentInfo();
        Cursor c = db.rawQuery("select * from student_info where name = ?", new String[]{name});
        while (c.moveToNext()) {
        	student.setId(c.getInt(c.getColumnIndex("student_id")));
        	student.setAge(c.getInt(c.getColumnIndex("age")));
        	student.setAddress(c.getString(c.getColumnIndex("address")));
        	student.setTeacher(c.getString(c.getColumnIndex("teacher")));
        	student.setPhone(c.getLong(c.getColumnIndex("phone")));
        }
        c.close();
        db.close();
        return student;
    }

    @Override
    public boolean isExists(String name) {
        SQLiteDatabase db = mHelpter.getWritableDatabase();
        List<StudentInfo> list = new ArrayList<StudentInfo>();
        Cursor c = db.rawQuery("select * from student_info where name = ? ", new String[]{name});
        boolean isExists = c.moveToNext();
        c.close();
        db.close();
        return isExists;
    }
}

ok,在使用SQLite进行学生数据的本地缓存的时候,只要用几行代码就可以完成增删改查操作了,封装完成!





  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己的DBHelper: /** * * @author Kee.Li * * 1. 继承了SmartDBHelper,不需要重写SQLiteOpenHelper的那两个方法 * 2. 父构造方法参数modelClasses是实体的数组,也就是需要生产表的的Class数组 * */ public class DBHelper extends SmartDBHelper { //数据库名称 private final static String DATABASE_NAME = "books.db"; //数据库版本 private final static int DATABASE_VERSION = 2; //需要生成数据库表的的数组 private final static Class<?>[] modelClasses = {Book.class,User.class}; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION,modelClasses); } } 2.创建app需要的实体,也就是对应的数据库表(这里的实体添加到DBHelper的modelClasses数组中) /** * 数据库的实体 * @author Kee.Li * 关于注解: * Table: 此对应的数据库表名 * Id:标识此属性为数据库自增长的id,应为int型 * Column:标识此属性对应的数据库字段名 */ @Table(name="t_books") public class Book{ @Id @Column(name="book_id") private int bookId; @Column(name="book_name") private String bookName; @Column(name="book_author") private String bookAuthor; //set get 方法省略.... } 3. 实现DAO,也就是对实体的CRUD /** * @author Kee.Li * * 此只需要继承TemplateDAO,在构造方法里面给父的属性dbHelper赋值,即可实现CRUD操作 * 若有复杂的操作,可以自定义方法 */ public class BookDAO extends TemplateDAO { /** * 创建DAO时初始化连接数据库对象helper * @param context */ public BookDAO(Context context) { super(new DBHelper(context)); } } 4. activity的调用 bookDAO = new BookDAO(this); List books = bookDAO.find(); 好了,到此结束,如果有什么好的建议或者意见,希望可以共同学习!谢谢大家!
一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值