Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

简介: Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqli...

Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包


这里写图片描述

事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的,那也是比较老的逻辑了,后来我们准备重构项目的时候,我决定把数据库也重构一下,因为我们当时的应用读取速度来还是比较慢的,比如你有一两年的数据之类的,我后来就研究了一下这两个框架,虽然我最后采用的是GreenDao,但是ORMLite也是研究了一会儿,所以,接下来,我将把这两个框架分两篇文章来分析,首先就是ORMLite了,网上还是有很多关于他们的文章的,所以我也是准备站在巨人的肩膀上,首先他们之间的优缺点,也有前辈写了,你可以参考一下

而且鸿洋老师也写了两篇关于ORMLite的文章

但是就算他们写了,我觉得我再根据自己的逻辑去讲一遍,很多人还是会收益的,我自信我的文笔应该还是算不错的,而且我是基于Android studio来讲的。嘻嘻,话不多说,我们来新建一个项目:

这里写图片描述

一.准备工作

在以前,我们写数据库时怎么写的?那就是频繁的去写SQLiteOpenHelper了,所以后来在我们开发中,很多人就喜欢封装他们,提高性能,也就出现了很多的数据库框架,ORMLite算是一个佼佼者了

我们根据官方文档来看这个框架是怎么样集成的,官网上有共有四个步骤

这里写图片描述

知道他需要两个jar,一个android的,一个core的可以直接去下载

这里写图片描述

然后添加到libs目录下,然后右键——Add As Library就算是添加成功了,紧接着,我们在xml中写个按钮用来创建表和保存数据

     <Button
        android:id="@+id/btn_create_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建表 | 保存数据" />

二.Bean类

OK,我们继续看文档,他需要编写一个bean类来声明一些表明和字段的

这里写图片描述

既然如此,那我们就创建好了,这个类可不简单,它主要通过注解去注明表单信息,然后映射给整个数据库,我们看

package com.lgl.ormlite;

import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;

/**
 * bean类,对应的整个数据库的表单信息,帮助我们映射到整个数据库当中
 * Created by LGL on 2016/6/26.
 */
//配置表名
@DatabaseTable(tableName = "user_info")
public class User {
    //配置主键 id
    @DatabaseField(generatedId = true)
    private int id;
    //名称
    @DatabaseField(columnName = "name")
    private String name;
    //描述
    @DatabaseField(columnName = "desc")
    private String desc;

    //空构造
    public User(){

    }
    //构造方法
    public User(int id, String name, String desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }

    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 String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

写起来还是逻辑性很强的,如果需要一些特别的参数的话,可以参考一下官网上的项目描述,首先在User类上添加@DatabaseTable(tableName = “user_info”),标明这是数据库中的一张表名字为user_info,然后分别在属性上添加@DatabaseField(columnName = “name”) ,columnName的值为该字段在数据中的列名,@DatabaseField(generatedId = true) ,generatedId 表示id为主键且自动生成,好了,到这里,我们继续看官方的文档了

三.Dao类

官网写的很详细呀,我们跟着造轮子既可呀,嘿嘿,那我们就来写这个Dao类吧,注意,注释写的很清楚了哦!

这里写图片描述

package com.lgl.ormlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * Dao类
 * Created by LGL on 2016/6/26.
 */
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {

    //创建数据库名称
    private static final String DATABASE_NAME = "ormlite_sql.db";
    //版本号
    private static final int DATABASE_VERSION = 1;
    //存放Dao
    private Map<String, Dao> maps = new HashMap<>();

    //单例模式
    private static DataBaseHelper instance;

    public static synchronized DataBaseHelper getInstance(Context context) {
        if (instance == null) {
            synchronized (DataBaseHelper.class) {
                if (instance == null) {
                    instance = new DataBaseHelper(context);
                }
            }
        }
        return instance;
    }

    /**
     * 获得数据库的访问对象
     *
     * @param cls
     * @return
     * @throws SQLException
     */
    public synchronized Dao getDao(Class cls) throws SQLException {
        Dao dao = null;
        //通过反射获得类的名称
        String clsName = cls.getSimpleName();
        //是否存在该对象
        if (maps.containsKey(clsName)) {
            dao = maps.get(clsName);
        } else {
            dao = super.getDao(cls);
            maps.put(clsName, dao);
        }
        return dao;
    }

    /**
     * 关闭所有操作
     */
    public void close() {
        super.close();
        //获取所有的map键值对置空
        for (String key : maps.keySet()) {
            Dao dao = maps.get(key);
            dao = null;
        }
    }

    //构造方法
    public DataBaseHelper(Context context) {
        //上下文,数据库名,null,版本号
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //创建数据库
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            //对数据库的创建以及表的建立
            TableUtils.clearTable(connectionSource, User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //更新数据库
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
        try {
            //调用更新就删除数据库
            TableUtils.dropTable(connectionSource, User.class, true);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

到这里,我们的前期都OK了,紧接着,我们就可以去操作这些数据了

四.UserDao类

这个类主要是对数据的初始化和操作的

package com.lgl.ormlite;

import android.content.Context;

import com.j256.ormlite.dao.Dao;

import java.sql.SQLException;

/**
 * 数据库操作类
 * Created by LGL on 2016/6/26.
 */
public class UserDao {

    //上下文
    private Context mContext;
    //主键查询
    private Dao<User,Integer>userDao;
    //Dao类
    private DataBaseHelper helper;

    public UserDao(Context mContext) {
        this.mContext = mContext;
        //创建数据库
        helper = DataBaseHelper.getInstance(mContext);
        try {
            //操作Dao
            userDao = helper.getDao(User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public void  addUser(User user){
        try {
            userDao.create(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

五.增

OK,基本上现在可以去实际的操作了,这个UserDao类我们等下还需要去完善,现在先这样,我们去实现按钮的点击事件

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create_save:
                userDao = new UserDao(this);
                User user = new User();
                user.setName("lgl");
                user.setDesc("Android");
                userDao.addUser(user);
                break;
        }
    }

到这里,我们就可以去操作了,我们去看数据库,打开DDMS

这里写图片描述

当然,你也可以打开看看

这里写图片描述

既然插入成功了,那我们尝试一下多条语句的插入吧

           case R.id.btn_create_save:
                User user = new User();
                user.setName("lgl");
                user.setDesc("Android");
                userDao.addUser(user);

                User user1 = new User();
                user.setName("zhangsan");
                user.setDesc("IOS");
                userDao.addUser(user1);

                User user2 = new User();
                user.setName("lisi");
                user.setDesc("python");

                userDao.addUser(user2);
                break;

OK,运行一下

这里写图片描述

六.改

我们继续操作UserDao这个类

    //更新User
    public void updateUser(User user) {
        try {
            userDao.update(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

既然可以更新,那我们写个按钮

     <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改数据" />

写完之后,我们就可以执行了

       case R.id.btn_update:
                //我们可以修改id为1的这个数据
                User user3 = new User();
                user3.setId(1);
                user3.setName("lgl帅哥");
                userDao.updateUser(user3);
                break;

我们可以看下结果

这里写图片描述

OK,这就是我们的改了,我们可以封装一下

    /**
     * 根据ID来更新
     * @param user
     * @param id
     */
    public void updateById(User user,Integer id){
        try {
            userDao.updateId(user,id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

还有一个修改方法

/**
     * 修改数据,支持多条
     *
     * @param user
     */
    public void updateUserByBuilder(User user) {
        try {
            UpdateBuilder builder = userDao.updateBuilder();
            builder.updateColumnValue("name", user.getName()).where().eq("id", 1);
            builder.update();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

七.删除

删除我们可以根据条件删除,就直接贴代码了

   /**
     * 删除
     *
     * @param user
     */
    public void deleteUser(User user) {
        //删除的方法比较多,根据的条件也比较多
        try {
            userDao.delete(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 多个对象的删除操作
     *
     * @param users
     */
    public void deleteMulUser(List<User> users) {
        try {
            userDao.delete(users);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据ID删除
     *
     * @param ids
     */
    public void deleteUserById(List<Integer> ids) {
        try {
            userDao.deleteIds(ids);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

你要删除直接调用就好了

八.查

查算是比较多的场景了,我们也可以多条件查询,看我们全部查询的例子

   /**
     * 全部查询
     *
     * @return
     */
    public List<User> listAll() {
        try {
            return userDao.queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

但是我们一般也不会用到全部查询,条件查询才是必须的,所以我们再新建一个按钮


    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询数据" />

OK.我们就可以查询了,我们写个单表查询

/**
     * 查询单张表
     *
     * @return
     */
    public List<User> queryBuilder() {
        List<User> list = null;
        //查询器
        QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();
        //声明where条件
        Where<User, Integer> where = queryBuilder.where();
        //查询sesc字段的name是哪个值
        try {
            where.eq("name", "lgl");
            where.and();
            where.eq("desc", "Android");
            where.prepare();
            list = queryBuilder.query();
            //select * from user_info where name = 'lgl' and desc = 'Android'
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

注意在点击事件里

 case R.id.btn_query:
     List<User> list = userDao.queryBuilder();
     Log.i(TAG, list.toString());
   break;

好的,我们现在看Log

这里写图片描述

我们多条件查询

    /**
     * 多条件查询
     *
     * @return
     */
    public List<User> queryBuilders() {
        List<User> list = null;
        QueryBuilder<User, Integer> queryBuilder = userDao.queryBuilder();
        Where<User, Integer> where = queryBuilder.where();
        try {
            where.or(where.and(where.eq("", ""), where.eq("", "")), where.and(where.eq("", ""), where.ge("", ""))).query();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

这里我们就不演示了

最后,只能说,ORMLite是比较强大的,我们如果真的要去理解他的话,还是得去看他的API文档,不然真的无从下手,我这篇博文也只是希望大家能对ORMLite有个大概的了解,不敢妄自说精通,好的,本篇博客到这里也就结束了,如果大家觉得还不错的话,不妨点个赞!

Demo下载:http://download.csdn.net/detail/qq_26787115/9562367

欢迎加群:555974449

目录
相关文章
|
12天前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
60 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
14天前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
59 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
5月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
3月前
|
Java Android开发
Eclipse 创建 Java 包
Eclipse 创建 Java 包
47 1
|
4月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
112 15
|
3月前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
4月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
238 0
Java/Spring项目的包开头为什么是com?
|
4月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
102 3
|
4月前
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
158 0
数据库的连接用Java
|
4月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
283 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 10
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件