效果图:

 

项目目录截图:

1、activity_main.xml

  描述:

    两行显示8个按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="添加用户"
android:onClick="addUser"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="查询用户"
android:onClick="findUserList"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="删除用户"
android:onClick="deleteUser"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="修改用户"
android:onClick="updateUser"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout> <LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:text="添加部门"
android:onClick="addDept"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="查询部门"
android:onClick="findDeptList"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="添加员工"
android:onClick="addEmp"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:text="查询员工"
android:onClick="findEmpList"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>

2、MainActivity.java

package com.nf.android_ormlite;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast; import com.nf.dao.DeptDao;
import com.nf.dao.EmpDao;
import com.nf.dao.UsersDao;
import com.nf.entity.TbDept;
import com.nf.entity.TbEmp;
import com.nf.entity.Users; import java.sql.SQLException;
import java.util.Date;
import java.util.List; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//添加用户操作
//new一个Users将用户的编号、用户名、密码、日期封装起来交给UsersDao里的addUsers()方法进行添加用户的操作
//添加成功返回结果并弹出提示
public void addUser(View view) throws SQLException {
boolean res=new UsersDao(this).addUsers(new Users(0,"abc","123123",new Date()));
Toast.makeText(this, "添加用户结果是:"+res, Toast.LENGTH_SHORT).show();
}
//查询用户信息列表的操作
//调用UsersDao里的getUserList()方法从数据库中获取到所有用户的信息,保存到list集合中
public void findUserList(View view) throws SQLException {
List<Users> users=new UsersDao(this).getUserList();
//对list集合进行循环遍历,取出用户编号、用户名称、用户密码写入日志中
for (Users user:users){
Log.i("FindUserList:",user.get_id()+","+user.getUname()+","+user.getUpwd());
}
}
//根据用户ID删除用户信息的操作
//调用UserDao中的deleteUsers()方法传入一个用户ID,删除该ID对应的用户信息
public void deleteUser(View view) throws SQLException {
UsersDao dao=new UsersDao(this);
Users user=dao.getUserById(3);
boolean res=new UsersDao(this).deleteUsers(user);
Toast.makeText(this, "删除用户结果是:"+res, Toast.LENGTH_SHORT).show();
}
//修改用户信息的操作
//调用UserDao的updateUsers()方法将编号为2的用户的用户名称修改为Toms
public void updateUser(View view) throws SQLException { UsersDao dao=new UsersDao(this);
Users user=dao.getUserById(2);
user.setUname("Toms");
boolean res=dao.updateUsers(user);
Toast.makeText(this, "修改用户结果是:"+res, Toast.LENGTH_SHORT).show();
}
//添加部门的操作
//调用DeptDaod的addDept()方法添加一个学工部
public void addDept(View view) throws SQLException {
TbDept dept=new TbDept(0,"学工部");
new DeptDao(this).addDept(dept);
Toast.makeText(this, "添加部门成功", Toast.LENGTH_SHORT).show();
}
//查询部门的操作
//调用DeptDao的findDeptList()方法从数据库中获取所有的部门信息放入list集合中
public void findDeptList(View view) throws SQLException {中心
List<TbDept> list=new DeptDao(this).findDeptList();
//对list集合进行循环遍历,获取出部门编号、部门名称、该部门员工的人数
for(TbDept dept:list){
Log.i("DeptList:",dept.get_id()+","+dept.getDname()+","+dept.getEmps().size());
}
}
//添加员工的操作
//调用TbEmp()实体对象封装一名员工信息
//再调用EmpDao中的addEmp()方法将员工信息添加到数据库
//我们在员工表里再绑定他所在的部门
public void addEmp(View view) throws SQLException {
TbEmp emp=new TbEmp(0,"Kite",22,"男");
//取出学术部
TbDept dept=new DeptDao(this).getDeptById(2);
//绑定员工和部门
emp.setDept(dept);
//保存员工
new EmpDao(this).addEmp(emp);
Toast.makeText(this, "添加员工成功", Toast.LENGTH_SHORT).show();
}
//查询员工信息的操作
//调用EmpDao中的findempList()方法从数据库中查询出来放入list集合
public void findEmpList(View v) throws Exception{
List<TbEmp> emps=new EmpDao(this).findEmpList();
//退list集合进行循环遍历,查询出所有员工的编号、姓名、部门名称
for (TbEmp emp:emps){
Log.i("EmpList:",emp.get_id()+","+emp.getEname()+","+emp.getDept().getDname());
}
}
}

3、dao/DeptDao.java

package com.nf.dao;
import android.content.Context; import com.nf.entity.TbDept;
import com.nf.utils.DbHelper; import java.sql.SQLException;
import java.util.List; public class DeptDao { private DbHelper dbHelper;
public DeptDao(Context context){
     //实例化DbHelper
dbHelper=DbHelper.getInstance(context);
} public boolean addDept(TbDept dept) throws SQLException {
     //通过dbHelper调用getDaos()
dbHelper.getDaos(TbDept.class).create(dept);
return true;
} public List findDeptList() throws SQLException {
return dbHelper.getDaos(TbDept.class).queryForAll();
} public TbDept getDeptById(int id) throws SQLException {
return (TbDept) dbHelper.getDaos(TbDept.class).queryForId(id);
}
}

4、dao/EmpDao.java

package com.nf.dao;
import android.content.Context; import com.nf.entity.TbEmp;
import com.nf.utils.DbHelper; import java.sql.SQLException;
import java.util.List; /**
* Created by Administrator on 2017/12/13.
*/ public class EmpDao { private DbHelper dbHelper;
public EmpDao(Context context){
dbHelper=DbHelper.getInstance(context);
} public boolean addEmp(TbEmp emp) throws SQLException {
dbHelper.getDaos(TbEmp.class).create(emp);
return true;
} public List findEmpList() throws SQLException {
return dbHelper.getDaos(TbEmp.class).queryForAll();
}
}

5、dao/UsersDao.java

package com.nf.dao;
import android.content.Context; import com.nf.entity.Users;
import com.nf.utils.DbHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.UpdateBuilder; import java.sql.SQLException;
import java.util.List; /**
* Created by Administrator on 2017/12/13.
*/ public class UsersDao { private DbHelper dbHelper;
private Dao dao;//DbHelper对象提供的一个对象持久化类
public UsersDao(Context context){
dbHelper=new DbHelper(context);
try {
dao=dbHelper.getDao(Users.class);
} catch (SQLException e) {
e.printStackTrace();
}
} //添加一个用户
public boolean addUsers(Users user) throws SQLException {
dao.create(user);
return true;
} //修改一个用户
public boolean updateUsers(Users user) throws SQLException {
dao.update(user);
return true;
} //删除一个用户
public boolean deleteUsers(Users user) throws SQLException {
dao.delete(user);
return true;
} public Users getUserById(int id) throws SQLException {
Users user=(Users) dao.queryForId(id);
return user;
} public List getUserList() throws SQLException {
List list=dao.queryForAll();
return list;
} //==============批量操作=============//
public boolean addUsers(List<Users> users) throws SQLException {
dao.create(users);
return true;
}
public boolean deleteUsers(List<Users> users) throws SQLException {
dao.delete(users);
return true;
} //==============带条件修改删除查询=============//
public boolean updateUsersByPwd(String query) throws SQLException {
UpdateBuilder builder=dao.updateBuilder();
builder.where().like("upwd",query);
builder.updateColumnValue("upwd","123456");
builder.update();
return true;
} public boolean deleteUsers(String name) throws SQLException {
DeleteBuilder builder=dao.deleteBuilder();
builder.where().eq("uname",name);
builder.delete();
return true;
}
public List findUserList(String name) throws SQLException {
QueryBuilder builder=dao.queryBuilder();
builder.where().like("uname","%"+name+"%");
builder.orderBy("uintime",true);
List list=builder.query();
return list;
}
}

6、entity/TbDept.java

package com.nf.entity;
import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable; import java.io.Serializable; @DatabaseTable(tableName = "tb_dept") //通过注解的方式设置部门表的表名
public class TbDept implements Serializable { @DatabaseField(generatedId = true)//设置部门编号 generatedId = true表示编号自动增长
private int _id;
@DatabaseField //默认设置
private String dname; //一对多的关系
@ForeignCollectionField(eager = false)
private ForeignCollection<TbEmp> emps; public TbDept() {
} public TbDept(int _id, String dname) {
this._id = _id;
this.dname = dname;
} public int get_id() {
return _id;
} public void set_id(int _id) {
this._id = _id;
} public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} public ForeignCollection<TbEmp> getEmps() {
return emps;
} public void setEmps(ForeignCollection<TbEmp> emps) {
this.emps = emps;
}
}

7、entity/TbEmp.java

package com.nf.entity;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import java.io.Serializable;
//指定表名称
@DatabaseTable(tableName = "tb_emp")
public class TbEmp implements Serializable { @DatabaseField(generatedId = true)
private int _id;
@DatabaseField
private String ename;
@DatabaseField
private int eage;
@DatabaseField
private String esex; //多对一的关系
@DatabaseField(columnName = "edno",foreign = true,foreignAutoRefresh = true,canBeNull = false)
private TbDept dept; public TbEmp() {
} public TbEmp(int _id, String ename, int eage, String esex) {
this._id = _id;
this.ename = ename;
this.eage = eage;
this.esex = esex;
} public int get_id() {
return _id;
} public void set_id(int _id) {
this._id = _id;
} public String getEname() {
return ename;
} public void setEname(String ename) {
this.ename = ename;
} public int getEage() {
return eage;
} public void setEage(int eage) {
this.eage = eage;
} public String getEsex() {
return esex;
} public void setEsex(String esex) {
this.esex = esex;
} public TbDept getDept() {
return dept;
} public void setDept(TbDept dept) {
this.dept = dept;
}
}

8、entity/Users.java

package com.nf.entity;

import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable; import java.io.Serializable;
import java.util.Date; /**
* Created by Administrator on 2017/12/13.
*/
@DatabaseTable(tableName = "tb_users")
public class Users implements Serializable{
   //指定该字段为主键且自动增长
@DatabaseField(generatedId = true)
private int _id;
   //指定字段不能为空
@DatabaseField(canBeNull = false)
private String uname;
@DatabaseField(canBeNull = false)
private String upwd;
@DatabaseField(dataType = DataType.DATE)
private Date uintime; public Users() {
} public Users(int _id, String uname, String upwd, Date uintime) {
this._id = _id;
this.uname = uname;
this.upwd = upwd;
this.uintime = uintime;
} public int get_id() {
return _id;
} public void set_id(int _id) {
this._id = _id;
} public String getUname() {
return uname;
} public void setUname(String uname) {
this.uname = uname;
} public String getUpwd() {
return upwd;
} public void setUpwd(String upwd) {
this.upwd = upwd;
} public Date getUintime() {
return uintime;
} public void setUintime(Date uintime) {
this.uintime = uintime;
}
}

9、DbHelper.java

package com.nf.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast; import com.nf.entity.TbDept;
import com.nf.entity.TbEmp;
import com.nf.entity.Users;
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.util.Date;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
//构建一个DbHelper类继承OrmLiteSqliteOpenHelper 实现对数据库的操作
public class DbHelper extends OrmLiteSqliteOpenHelper {
//定义数据库名称
private static final String DATABASE_NAME="ormlite.db";
//定义数据库的版本
private static final int VERSION=3;
//构造器,将上下文对象、数据库名称、工厂、版本信息初始化
public DbHelper(Context context) {//用于通过注解+反射创建数据库表
super(context, DATABASE_NAME, null, VERSION);//用于通过读取配置文件创建数据库表
}
private DbHelper(Context context, String databaseName, SQLiteDatabase.CursorFactory factory, int databaseVersion) {
super(context, DATABASE_NAME, null, VERSION);
} //第一次创建数据库时执行
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
//创建表Tb_users
TableUtils.createTableIfNotExists(connectionSource, Users.class);
//创建表Tb_dept
TableUtils.createTableIfNotExists(connectionSource, TbDept.class);
//创建表Tb_emp
TableUtils.createTableIfNotExists(connectionSource, TbEmp.class);
} catch (SQLException e) {
e.printStackTrace();
} //加入测试数据
try {
//调用Dao中的getDao()方法传入一个实体对象,实体对象里封装一个用户,通过create()方法,将这个用户初始化到tb_users数据表中
Dao dao=getDao(Users.class);//创建一个Users类的Dao
dao.create(new Users(0,"admins","admins",new Date()));
} catch (SQLException e) {
e.printStackTrace();
}
Log.i("create table","创建数据表成功");
} @Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource,Users.class,true);
TableUtils.dropTable(connectionSource,TbEmp.class,true);
TableUtils.dropTable(connectionSource,TbDept.class,true);
onCreate(database,connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
} //===================提供单例模式DbHelper对象提供服务=========================//
private static DbHelper dbHelper; public static synchronized DbHelper getInstance(Context context){
if(dbHelper==null){
dbHelper=new DbHelper(context);
}
return dbHelper;
} //==================构建一个Dao栈,统一管理Dao=======================//
private Map<String,Dao> daos=new HashMap<String,Dao>(); public Dao getDaos(Class cls) throws SQLException {
String className=cls.getName();//获取类名
if(!daos.containsKey(className)){
daos.put(className,super.getDao(cls));
}
return daos.get(className);
} //重写DbHelper的close方法
@Override
public void close() {
super.close();
Iterator it=daos.keySet().iterator();
while(it.hasNext()){
Dao dao=(Dao) it.next();
dao=null;
}
}
}

Android开发 ---ORMLite实现数据的增删改查,单例模式,Dao栈的更多相关文章

  1. 三年Android开发,竟只会增删改查,被面试官一顿怼!

    最近看到某公司面试官发的这样一个帖子: 我面试了一个有三年Android开发经验的小伙子,也是我有史以来给别人面试时间最短的一次,不到十分钟就结束了,原因很简单,底子太差只会curd,很多技术性的问题 ...

  2. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  3. python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)

    一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...

  4. django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能

    1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...

  5. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  6. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  7. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  8. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

  9. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

随机推荐

  1. python多线程学习一

    本文希望达到的目标: 多线程的基本认识 多线程编程的模块和类的使用 Cpython的全局解释器锁GIL 一.多线程的基本认识 多线程编程的目的:并行处理子任务,大幅度地提升整个任务的效率. 线程就是运 ...

  2. div “下沉”

    最近在做一个计算器,按键整体布局如下: Div2,div3 display属性设置为inline-block.三个div “容器”没添加任何元素时,布局是符合预想的.添加上按键后,布局变成下面这样了: ...

  3. HP Jack介绍

    转载:https://www.cnblogs.com/Peter-Chen/p/3999212.html 目前市场上耳机分为4环耳机(图1所示,iphone型)和3环耳机(图2所示).4环耳机称为he ...

  4. 实现Runnable接口创建多线程及其优势

    实现Runnable接口创建多线程: 创建一个Runnable接口的实现类RunnableImpl: 主线程中: 其中,链式编程的Thread类的静态方法currentThread方法点getName ...

  5. 当SQL Server的实例位于集群的特定节点时,数据库无法远程访问

    搭建好了一个集群环境,发现当SQL Server的实例位于集群的其中一个节点时,数据库无法远程访问,报如下错误.但在另一个 节点时,数据库访问正常. 标题: 连接到服务器 -------------- ...

  6. P2365 任务安排 / [FJOI2019]batch(斜率优化dp)

    P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...

  7. Docker Compose 配置文件常用指令

    Docker Compose 配置文件常用指令 YAML文件格式及编写注意事项 YAML是一种标记语言很直观的数据序列化格式,可读性高.类似于XML数据描述语言,语法比XML简单的很多. YAML数据 ...

  8. bzoj 1835 base 基站选址 - 动态规划 - 线段树

    题目传送门 需要高级权限的传送门 题目大意 有$n$个村庄坐落在一条直线上,第$i \ \ \ (i>1)$个村庄距离第$1$个村庄的距离为$D_i$.需要在这些村庄中建立不超过$K$个通讯基站 ...

  9. react的dva框架初试

    使用背景:迫不得已!!(自己入职是以vue技术入职的,说是马上vue项目就来了,让我负责这个项目的前端.但是入职后就让我下了现在这个项目看下,然后就顺理成章的帮忙进行开发了,其实自己一直想要做reac ...

  10. Windows7下安装redmine-3.4.6

    Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.Redmine建立在Ruby on Rails(一个用于开发数据库驱动的网络应用程序的完整框架,基于计算机软件语言Ruby,给程序开发 ...