Android企业级架构-仿微信-数据库搭建

在上一篇文章中,我们完成了原始的网络框架搭建,现在我们来搭建一下数据库和UI的基础建设。

数据库

数据库方面网上也有非常多的ORM框架,像OrmLite、GreenDAO等都是非常不错的数据映射框架。但使用起来或多或少都存在着一些不便。下面笔者为大家推荐一款非常轻量级的数据库框架LiteOrm,为什么说它非常轻量呢,因为你只需创建一个实体类,然后使用它的API去操作即可,完全不用考虑其它事情。这款国人自己开发的数据库Orm,针对中小型产品完全够用。
具体用法大家可自行查看。它最大的不足是没有Maven依赖,要想使用它,需要把源码DOWN下来,添加到项目中去。

  1. 进入LiteOrm页面,将源码下载下来。
  2. 解压文件,进入android-lite-orm-master->library->src->com目录下,将整个litesuits文件夹复制到我们项目的database->src->main->java->com目录下。这里大家可以直接到我的GitHub里找到,然后替换到你们的工程里,因为这个源码有些方法无法编译,笔者的代码是修改完的。
  3. 因为这个框架是比较完善的,使用起来也很简洁,最重要的是在一个工程中,经常替换数据库框架的可能性实在太低,所以,我们简单的对这个框架的API做一个装饰者即可,不需要大动干戈的去封装。所以,在com.monch.database包下创建一个类,起名叫DB,代码如下:
public class DB implements DataBase {

    private LiteOrm mLiteOrm;

    private DB(DataBaseConfig config) {
        mLiteOrm = LiteOrm.newSingleInstance(config);
    }

    private static volatile DB instance;

    public static void initialize(DataBaseConfig config) {
        instance = new DB(config);
    }

    public static DB get() {
        if (instance == null) {
            throw new IllegalArgumentException("DB instance is null.");
        }
        return instance;
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase() {
        return mLiteOrm.openOrCreateDatabase();
    }

    @Override
    public long save(Object entity) {
        return mLiteOrm.save(entity);
    }

    @Override
    public <T> int save(Collection<T> collection) {
        return mLiteOrm.save(collection);
    }

    @Override
    public long insert(Object entity) {
        return mLiteOrm.insert(entity);
    }

    @Override
    public long insert(Object entity, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.insert(entity, conflictAlgorithm);
    }

    @Override
    public <T> int insert(Collection<T> collection) {
        return mLiteOrm.insert(collection);
    }

    @Override
    public <T> int insert(Collection<T> collection, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.insert(collection, conflictAlgorithm);
    }

    @Override
    public int update(Object entity) {
        return mLiteOrm.update(entity);
    }

    @Override
    public int update(Object entity, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.update(entity, conflictAlgorithm);
    }

    @Override
    public int update(Object entity, ColumnsValue cvs, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.update(entity, cvs, conflictAlgorithm);
    }

    @Override
    public <T> int update(Collection<T> collection) {
        return mLiteOrm.update(collection);
    }

    @Override
    public <T> int update(Collection<T> collection, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.update(collection, conflictAlgorithm);
    }

    @Override
    public <T> int update(Collection<T> collection, ColumnsValue cvs, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.update(collection, cvs, conflictAlgorithm);
    }

    @Override
    public int update(WhereBuilder builder, ColumnsValue cvs, ConflictAlgorithm conflictAlgorithm) {
        return mLiteOrm.update(builder, cvs, conflictAlgorithm);
    }

    @Override
    public int delete(Object entity) {
        return mLiteOrm.delete(entity);
    }

    @Override
    public <T> int delete(Class<T> claxx) {
        return mLiteOrm.delete(claxx);
    }

    @Override
    public <T> int deleteAll(Class<T> claxx) {
        return mLiteOrm.deleteAll(claxx);
    }

    @Override
    public <T> int delete(Class<T> claxx, long start, long end, String orderAscColu) {
        return mLiteOrm.delete(claxx, start, end, orderAscColu);
    }

    @Override
    public <T> int delete(Collection<T> collection) {
        return mLiteOrm.delete(collection);
    }

    @Override
    public <T> int delete(Class<T> claxx, WhereBuilder where) {
        return mLiteOrm.delete(claxx, where);
    }

    @Override
    public int delete(WhereBuilder where) {
        return mLiteOrm.delete(where);
    }

    @Override
    public <T> ArrayList<T> query(Class<T> claxx) {
        return mLiteOrm.query(claxx);
    }

    @Override
    public <T> ArrayList<T> query(QueryBuilder<T> qb) {
        return mLiteOrm.query(qb);
    }

    @Override
    public <T> T queryById(long id, Class<T> clazz) {
        return mLiteOrm.queryById(id, clazz);
    }

    @Override
    public <T> T queryById(String id, Class<T> clazz) {
        return mLiteOrm.queryById(id, clazz);
    }

    @Override
    public <T> long queryCount(Class<T> claxx) {
        return mLiteOrm.queryCount(claxx);
    }

    @Override
    public long queryCount(QueryBuilder qb) {
        return mLiteOrm.queryCount(qb);
    }

    @Override
    public SQLStatement createSQLStatement(String sql, Object[] bindArgs) {
        return mLiteOrm.createSQLStatement(sql, bindArgs);
    }

    @Override
    public boolean execute(SQLiteDatabase db, SQLStatement statement) {
        return mLiteOrm.execute(db, statement);
    }

    @Override
    public boolean dropTable(Object entity) {
        return mLiteOrm.dropTable(entity);
    }

    @Override
    public boolean dropTable(Class<?> claxx) {
        return mLiteOrm.dropTable(claxx);
    }

    @Override
    public boolean dropTable(String tableName) {
        return mLiteOrm.dropTable(tableName);
    }

    @Override
    public ArrayList<RelationKey> queryRelation(Class class1, Class class2, List<String> key1List) {
        return mLiteOrm.queryRelation(class1, class2, key1List);
    }

    @Override
    public <E, T> boolean mapping(Collection<E> col1, Collection<T> col2) {
        return mLiteOrm.mapping(col1, col2);
    }

    @Override
    public SQLiteDatabase getReadableDatabase() {
        return mLiteOrm.getReadableDatabase();
    }

    @Override
    public SQLiteDatabase getWritableDatabase() {
        return mLiteOrm.getWritableDatabase();
    }

    @Override
    public TableManager getTableManager() {
        return mLiteOrm.getTableManager();
    }

    @Override
    public SQLiteHelper getSQLiteHelper() {
        return mLiteOrm.getSQLiteHelper();
    }

    @Override
    public DataBaseConfig getDataBaseConfig() {
        return mLiteOrm.getDataBaseConfig();
    }

    @Override
    public SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) {
        return mLiteOrm.openOrCreateDatabase(path, factory);
    }

    @Override
    public boolean deleteDatabase() {
        return mLiteOrm.deleteDatabase();
    }

    @Override
    public boolean deleteDatabase(File file) {
        return mLiteOrm.deleteDatabase(file);
    }

    @Override
    public void close() {
        mLiteOrm.close();
    }
}

这里我没有做任何的修饰,只是使用装饰者模式包装了一次,避免当我们真要替换框架时出现巨大工作量的尴尬。

  1. 接下来给大家说明一下DB类的使用,代码如下

学校实体类:

@Table("School")    // 这是表名
public class SchoolEntity implements Serializable {

    // 每个实体类一定要实现 Serializable 接口,并且添加此变量
    // 了解序列化的同学都知道,Serializable是一种稳定的序列化方式
    // 这种序列化的优点是稳定,缺点是序列化时会生成较多的变量占用内存
    // 这个属性是Serializable的版本号,一旦改变,将无法反序列化,
    // 所以这个值,确定后就不要修改
    private static final long serialVersionUID = -1;

    @PrimaryKey(AssignType.AUTO_INCREMENT)  // 主键,这是表示自增ID
    public long id;
    // 学校名称
    public String name;
    // 学校地址,@Column是设置列名的注解
    @Column("address")
    public String address;
    // LiteOrm数据库可以直接将引用类型的数据,序列化为字节,存入表中
    // 前提是这个引用类型一定要实现Serializable接口
    public List<ClassEntity> classes;

}

班级实体类:

// @Table是设置表名的注解,如果不设置,表名默认为包名+类名
// 比如此类将以com_monch_database_test_Class为表名
@Table("Class")
public class ClassEntity implements Serializable {

    private static final long serialVersionUID = -1;

    // 主键,这是表示自定义ID,操作数据库时,此属性一定要赋值
    @PrimaryKey(AssignType.BY_MYSELF)   
    public long id;

    // 班级名称
    public String name;
    // 班级人数
    public int count;

}

操作类:

        // 初始化数据库
        DB.initialize(new DataBaseConfig(context, "数据库名称.db", false, 1,
                new SQLiteHelper.OnUpdateListener() {
            @Override
            public void onUpdate(SQLiteDatabase db, int oldVersion, int newVersion) {
                if (newVersion > oldVersion) {
                    // 数据库更新回调
                }
            }
        }));

        // 创建学校
        SchoolEntity school = new SchoolEntity();
        school.name = "测试小学";
        school.address = "北京市测试街道110号";
        school.classes = new ArrayList<>(2);
        // 创建1班
        ClassEntity class1 = new ClassEntity();
        class1.id = 1;
        class1.name = "一年1班";
        class1.count = 30;
        school.classes.add(class1); // 将1班添加到学校中
        // 创建2班
        ClassEntity class2 = new ClassEntity();
        class2.id = 2;
        class2.name = "一年2班";
        class2.count = 20;
        school.classes.add(class2); // 将2班添加到学校中

        DB db = DB.get();
        // 保存学校,此时班级也被直接保存至学校表中
        // 说明一下save方法和insert方法:
        // insert方法是直接插入
        // save方法是以id为准,如果实例中有id并在表中存在此数据则执行更新,否则为插入
        long schoolId = db.save(school);
        // 按照id查询学校
        SchoolEntity querySchool = db.queryById(schoolId, SchoolEntity.class);
        // 删除学校
        int count = db.delete(SchoolEntity.class);

真正的操作代码:
// 保存
long schoolId = db.save(school);
// 查询
SchoolEntity querySchool = db.queryById(schoolId, SchoolEntity.class);
// 删除
int count = db.delete(SchoolEntity.class);

每句话都是一个功能,是不是很轻量?具体使用,大家可自行查看文档。
至此,数据库框架搭建完成。具体代码请移步GitHub查看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • Android_7_数据存数方式 使用SharedPreferences存储数据 获取SharedPreferen...
    icechao阅读 384评论 0 2
  • 前言 本文参考转发摘自:【郭霖博客】http://blog.csdn.net/guolin_blog?viewmo...
    _猜火车_阅读 3,485评论 0 5
  • 跑步第四天。 给今天的自己一个差评吧! 4.26公里。40分24秒。 晚饭后,原本打算是梁先生去游泳,我在旁边带娃...
    林培阅读 254评论 0 0