Android自定义数据库封装之ZzSQLHelper

ZzSQLHelper

Github传送门:https://github.com/zhouzhuo810/ZzSQLHelper 欢迎star

A powerful sqlite framework that supports ORM and Cursor mode.
(一个简单却强大的数据库封装工具。)

· 支持ORM和Cursor两种操作模式;

Gradle:

compile 'me.zhouzhuo.zzsqlhelper:zz-sql-helper:1.0.1'

Maven:

<dependency>
  <groupId>me.zhouzhuo.zzsqlhelper</groupId>
  <artifactId>zz-sql-helper</artifactId>
  <version>1.0.1</version>
  <type>pom</type>
</dependency>
推荐用法:

定义一个单例模式工具类(完成数据库配置、建表和数据库升级操作):

public class DbUtils {

    private static ZzSqlHelper helper;

    private DbUtils() {
    }

    public static ZzSqlHelper getInstance(Context context) {
        if (helper == null) {
            synchronized (DbUtils.class) {
                if (helper == null) {
                    helper = new ZzSqlHelper.Builder()
                            .setDbName("hello")
                            .setVersion(13)
//                            .addTableSql("create table if not exists student (id integer primary key , name varchar, phone varchar)")
                            .addTableEntity(TestEntity.StudentEntity.class)
                            .setUpgradeListener(new ZzSqlHelper.Builder.UpgradeListener() {
                                @Override
                                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                                    if (oldVersion != 0 && db != null && db.isOpen()) {
                                        db.execSQL("drop table studententity");
                                    }
                                }
                            })
                            .create(context);
                }
            }
        }
        return helper;
    }


}
日志打印:
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Logger.enable(true);
    }
}

ORM模式:

1.定义实体类,表名就是实体类名, 字段名就是属性名,
使用@Column()注解可以控制字段是否保存和获取

    public static class StudentEntity {

        //id是必须加的字段
        private int id;
        //save=false时,不保存和读取该字段
        @Column(save = false)
        private String name;
        //默认save=true
        @Column()
        private String phone;

        //... getter and setter
    }

增:

        //实体类
        TestEntity.StudentEntity studentEntity = new TestEntity.StudentEntity();
        studentEntity.setName("hello");
        studentEntity.setPhone("123");
        studentEntity.setMan(true);
        //保存实体类到数据库
        DbUtils.getInstance(this).save(studentEntity);
        //多个实体类可以用saveAll(List<Entity> list)方法。

        //条件删除
        DbUtils.getInstance(this).delete(TestEntity.StudentEntity.class,
                new ZzSqlHelper.WhereBuilder("name","==","hello"));
        //根据id删除某行
        DbUtils.getInstance(this).deleteById(TestEntity.StudentEntity.class, 2);
        //删除整个表
        DbUtils.getInstance(this).deleteAll(TestEntity.StudentEntity.class);

        //条件查询
        String sql2 = new SQLBuilder()
                .from(TestEntity.StudentEntity.class)
                .select()
                .build();
        List<TestEntity.StudentEntity> students = DbUtils.getInstance(this)
                .findAll(TestEntity.StudentEntity.class, sql2);
        //根据id查询
        TestEntity.StudentEntity entity = DbUtils.getInstance(this)
                 .findById(TestEntity.StudentEntity.class, 1);
        //查询表中所有数据
        List<TestEntity.StudentEntity> datas = DbUtils.getInstance(this)
                 .findAll(TestEntity.StudentEntity.class);

    //传入实体类对象和要更新的字段名,传null更新全部字段。
   entity.setMan(true);
   entity.setPhone("555");
   DbUtils.getInstance(this)
          .update(entity, "phone", "isMan");

Cursor模式:

        SQLBuilder b = new SQLBuilder();
        String sql = b.from(TestEntity.StudentEntity.class)
                .insert(new String[]{"name", "phone"}, new String[]{"tt", "yy"})
                .build();
        DbUtils.getInstance(this).execSQL(sql);

        String sql = new SQLBuilder()
                .from(TestEntity.StudentEntity.class)
                .delete()
                .where("name", "=", "tt")
                .build();
        DbUtils.getInstance(this).execSQL(sql);

        String sql = new SQLBuilder()
                .from(TestEntity.StudentEntity.class)
                .select()
                .build();
        Cursor cursor = DbUtils.getInstance(MainActivity.this).findAll(sql);
        while (cursor.moveToNext()) {
            Log.e("xxx", "id=" + cursor.getString(cursor.getColumnIndex("id")));
            Log.e("xxx", "name=" + cursor.getString(cursor.getColumnIndex("name")));
            Log.e("xxx", "phone=" + cursor.getString(cursor.getColumnIndex("phone")));
            Log.e("xxx", "isMan=" + cursor.getInt(cursor.getColumnIndex("isMan")));
        }
        cursor.close();

        SQLBuilder b = new SQLBuilder();
        String sql = b.from(TestEntity.StudentEntity.class)
                .update(new String[]{"phone"}, new String[]{"4343"})
                .where("id", "=", 1)
                .build();
        DbUtils.getInstance(this).execSQL(sql);
一个简单的基于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值