增删改查是一个应用最基础的操作,增删改查的流程走通了,下面的路程也就顺利多了。现在使用Android Studio开发一个简单的应用,该应用就实现了增删改查的操作,看似简单,到底简不简单呢,下面开始操作。

本文的功能

为了简便,增删改查在一个页面实现;

为了简便,activity里面写原生的代码,不使用插件;

为了简便,数据存储在Sqlite数据库文件中,使用GreenDao中间件操作数据库;

对User表进行增删改查,字段有userName,age,userUid

第一步,建立一个app项目,先把界面画出来

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="16dp"

android:paddingTop="8dp"

android:paddingRight="16dp"

android:paddingBottom="8dp"

tools:context=".MainActivity">

android:id="@+id/userUid"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginStart="24dp"

android:layout_marginTop="8dp"

android:layout_marginEnd="24dp"

android:hint="ID"

android:inputType="textEmailAddress"

android:selectAllOnFocus="true"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent" />

android:id="@+id/userName"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginStart="24dp"

android:layout_marginTop="8dp"

android:layout_marginEnd="24dp"

android:hint="姓名"

android:imeOptions="actionDone"

android:selectAllOnFocus="true"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/userUid" />

android:id="@+id/sex"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginStart="24dp"

android:layout_marginTop="8dp"

android:layout_marginEnd="24dp"

android:hint="性别"

android:imeOptions="actionDone"

android:selectAllOnFocus="true"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/userName" />

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="400dp"

android:gravity="left|center_vertical">

android:id="@+id/btn1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="新增"/>

android:id="@+id/btn2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="修改"/>

android:id="@+id/btn3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="删除"/>

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="500dp"

android:gravity="left|center_vertical">

android:id="@+id/btn4"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="根据id获取一个"/>

android:id="@+id/btn5"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="获取所有"/>

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="600dp"

android:gravity="left|center_vertical">

android:id="@+id/showText"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="TextView" />

界面效果图:

图-1

对于一个新手,要把界面画画整齐,还是有难度的,这就需要学习xml中的水平布置和垂直布置。

第二步,配置greenDao

在这篇文章中,使用了BaseApplication,也就是在app创建的那一刻去创建了数据库。这样写就有个弊端,如果每一个登录的用户,都创建一个数据库,根据登录唯一标识作为数据库名称,那么在登录的时候,还没有登录成功的时候,是获取不到登录唯一标识的,所以不应该在application里面创建数据库。

实际的应用场景,可能不是在安装app的那一刻创建数据库,有可能是在登录之后进行创建,所以这次对数据库配置文件进行了修改,去掉了BaseApplication类,直接使用DbManager类,进行数据库的操作,其他两个类不变;另外,在DbManager类中增加了关闭数据库的操作,关闭了数据库,同时也要回收DaoMaster和DaoSession,只有把这两项回收了,才能再重新创建数据库连接实例,获取新的session。

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import com.example.myapplication3.dao.DaoMaster;

import com.example.myapplication3.dao.DaoSession;

/**

* 数据库管理类

*/

public class DbManager {

// 是否加密

public static final boolean ENCRYPTED = false;

private static DbManager mDbManager;

private static DaoMaster.DevOpenHelper mDevOpenHelper;

private static DaoMaster mDaoMaster;

private static DaoSession mDaoSession;

private Context mContext;

private DbManager(Context context) {

this.mContext = context;

// 初始化数据库信息

mDevOpenHelper = new DaoMaster.DevOpenHelper(context, getDbName());

getDaoMaster(context);

getDaoSession(context);

}

public static DbManager getInstance(Context context) {

if (null == mDbManager) {

synchronized (DbManager.class) {

if (null == mDbManager) {

mDbManager = new DbManager(context);

}

}

}

return mDbManager;

}

/**

* 获取可读数据库

*

* @param context

* @return

*/

public static SQLiteDatabase getReadableDatabase(Context context) {

if (null == mDevOpenHelper) {

getInstance(context);

}

return mDevOpenHelper.getReadableDatabase();

}

/**

* 获取可写数据库

*

* @param context

* @return

*/

public static SQLiteDatabase getWritableDatabase(Context context) {

if (null == mDevOpenHelper) {

getInstance(context);

}

return mDevOpenHelper.getWritableDatabase();

}

/**

* 获取DaoMaster

*

* 判断是否存在数据库,如果没有则创建数据库

* @param context

* @return

*/

public static DaoMaster getDaoMaster(Context context) {

if (null == mDaoMaster) {

synchronized (DbManager.class) {

if (null == mDaoMaster) {

MyOpenHelper helper = new MyOpenHelper(context,getDbName(),null);

mDaoMaster = new DaoMaster(helper.getWritableDatabase());

}

}

}

return mDaoMaster;

}

/**

* 获取DaoMaster

*

* @param context

* @return

*/

// public static DaoMaster getDaoMaster(Context context) {

// if (null == mDaoMaster) {

// synchronized (DbManager.class) {

// if (null == mDaoMaster) {

//

// mDaoMaster = new DaoMaster(getWritableDatabase(context));

// }

// }

// }

// return mDaoMaster;

// }

/**

* 获取DaoSession

*

* @param context

* @return

*/

public static DaoSession getDaoSession(Context context) {

if (null == mDaoSession) {

synchronized (DbManager.class) {

mDaoSession = getDaoMaster(context).newSession();

}

}

return mDaoSession;

}

/**

* 获取数据库名称

* @return

*/

public static String getDbName(){

return "testdb.db";

}

/**

* 关闭数据库

*/

synchronized public void closeDb(){

if(mDevOpenHelper != null){

mDevOpenHelper.close();

}

mDevOpenHelper = null;

mDaoMaster = null;

mDaoSession = null;

}

}

第三步,编辑activity,对事件进行绑定;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import com.example.myapplication3.dbconfig.DbManager;

import com.example.myapplication3.entity.User;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//新增

findViewById(R.id.btn1).setOnClickListener(this);

//修改

findViewById(R.id.btn2).setOnClickListener(this);

//删除

findViewById(R.id.btn3).setOnClickListener(this);

//获取一个

findViewById(R.id.btn4).setOnClickListener(this);

//获取所有

findViewById(R.id.btn5).setOnClickListener(this);

}

@Override

public void onClick(View view) {

//新增操作

TextView textView = findViewById(R.id.userUid);

User user = new User();

user.setUserId(textView.getText().toString());

textView = findViewById(R.id.sex);

user.setSex(textView.getText().toString());

textView = findViewById(R.id.userName);

user.setUserName(textView.getText().toString());

List list = null;

switch(view.getId()){

case R.id.btn1:

//新增

DbManager.getDaoSession(this).getUserDao().insert(user);

break;

case R.id.btn2:

//修改

DbManager.getDaoSession(this).getUserDao().update(user);

break;

case R.id.btn3:

//删除

DbManager.getDaoSession(this).getUserDao().delete(user);

break;

case R.id.btn4:

//获取一个

user = DbManager.getDaoSession(this).getUserDao().load(user.getUserId());

textView = findViewById(R.id.showText);

textView.setText("ID:"+user.getUserId() +"性别:"+ user.getSex() + "姓名:"+user.getUserName());

break;

case R.id.btn5:

//获取所有

list = DbManager.getDaoSession(this).getUserDao().loadAll();

textView = findViewById(R.id.showText);

textView.setText("ID:"+list.get(0).getUserId() + "性别:" + list.get(0).getSex() + "姓名:"+list.get(0).getUserName()+"总数:" + list.size());

break;

}

}

}

测试结果:

新增-获取单个测试

修改-获取单个测试

新增-获取所有测试

删除-获取所有测试

从测试结果来看,操作都是ok的。当然,这里的实体类中,对用户名和ID都做了唯一标识验证,设置了@Unique,如果不符合表中唯一的话,系统报异常,app就被迫关闭了,嗯,验证没有做,或者再捕捉一下异常,就更完美了。

真实的业务需求,业务场景,需要在页面之间进行跳转,或者打开一个activity,并且需要传递参数等等。本示例并没有涉及到跳转,另外,获取所有的数据,展示的效果也很粗糙,如果一直这样写下去,估计也挺累人的,这不,已经深夜零点半了。

明天继续吧,应该是今晚,今晚争取把butterknife使用起来,毕竟视频都看过了,再不用起来,就彻底的忘记了,打铁要趁热,加油~!

android增删功能代码,Android Studio开发实战 之 增删改查相关推荐

  1. android增删功能代码,Android SQLite增删查改实例代码部分

    在 Android与SQLite数据库 这个专题里我们谈到了 SQLite 的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自 SQLiteOpenHelper 类的数据 ...

  2. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...

  3. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[前端篇] 后端篇 前端篇 创建vue项目 安装所需工具 开始编码 1.在根目录下添加vue.config.js文件 2.编写main.js 3.编写App.vue 4.编写ax ...

  4. mock模拟的数据能增删改查吗_Mock.js模拟数据,脱离后端独立开发,实现增删改查功能...

    在目前容近对端手近对端手近对端手近对端手近我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于 ...

  5. 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

    2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Dri ...

  6. Spring Boot 学习[四] web项目实战训练(增删改查,分页,排序)

    Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等. 几点说明: Spring boot开发web项目,通常打成 ...

  7. 巨杉数据库SequoiaDB在Java开发中的增删改查CURD

    文章目录 JSON应用开发 增删改查操作 1 快速入门 1.1 环境部署 部署SequoiaDB集群环境 部署Windows开发环境 1.2 正式开始 2 CURD教程 2.1 Java开发环境搭建 ...

  8. iOS开发-plist文件增删改查

    plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plis ...

  9. mysql php 增删数据,php学习之mysql数据的增删改查

    1.插入数据 语句:insert into 表名 [(字段1,字段2,字段3,-.)] values (值1,值2,值3,-); 单行插入数据 省略字段名,这种写法后面的值必须要完整,有多少字段就要插 ...

最新文章

  1. ORB_SLAM2代码阅读(2)——tracking线程
  2. 2018-03-02 Linux
  3. keras 多层lstm_tensorflow-如何在keras中堆叠多个lstm?
  4. 百度地图切割算法讲解
  5. html可视化布局工具_简介一些蜘蛛布局标签的饼图的绘制方法
  6. 源码解析:修改mysql密码出现错误1045
  7. 回馈顾客, 活动搞起 --- 策略模式
  8. Qt Embedded性能优化详解
  9. tftp命令下载或上传文件
  10. 2021-2027全球与中国专利分析服务市场现状及未来发展趋势
  11. 完美发布带摘要的dedecms幻灯片代码
  12. QT下载和安装 指南教程
  13. linux下rsync启动命令,linux下rsync命令详细整理
  14. Spark(四)— Spark Streaming
  15. 《银行业人工智能实践》
  16. 树莓派 python 笔记
  17. 斯坦福机器学习Coursera课程:第八次作业--推荐系统
  18. 2018年大学生设计竞赛浙江赛区H题-简易功率测量装置-试题分析
  19. 《Python编程:从入门到实践》第二章练习题
  20. Docker 镜像制作和管理

热门文章

  1. jquery实现数字滚动效果
  2. Matplotlib绘制好看的饼状图:电影类型数据的简单处理与可视化
  3. HTML写的第一个邮箱登陆的界面
  4. (6)Software Pack:生成MDK软件包(包内容介绍和PDSC文件介绍)
  5. 前端设计 之 蝉原则
  6. 二次开发:flowable审批流程实践与创建流程源码分析
  7. painter X Acrylics(丙烯)画笔
  8. android自动帧率原理,Android 帧率计算及优化
  9. 新浪微博搜索结果数据抓取
  10. 重视网络安全,从部署SSL证书开始