1.Client端代码编写

1.1activity_content_write.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal"> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="姓名:"
android:textColor="@color/black"
android:textSize="17sp" /> <EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入姓名"
android:inputType="text"
android:maxLength="12"
android:text="Jack"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="年龄:"
android:textColor="@color/black"
android:textSize="17sp" /> <EditText
android:id="@+id/et_age"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入年龄"
android:inputType="number"
android:maxLength="2"
android:text="18"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_height"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="身高:"
android:textColor="@color/black"
android:textSize="17sp" /> <EditText
android:id="@+id/et_height"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入身高"
android:inputType="number"
android:maxLength="3"
android:text="180"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal"> <TextView
android:id="@+id/tv_weight"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="体重:"
android:textColor="@color/black"
android:textSize="17sp" /> <EditText
android:id="@+id/et_weight"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/editext_selector"
android:hint="请输入体重"
android:inputType="numberDecimal"
android:maxLength="5"
android:text="180"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout> <CheckBox
android:id="@+id/ck_married"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:gravity="center"
android:text="已婚"
android:textColor="@color/black"
android:textSize="17sp" /> <Button
android:id="@+id/btn_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:textColor="@color/black"
android:textSize="17sp" /> <Button
android:id="@+id/btn_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取"
android:textColor="@color/black"
android:textSize="17sp" /> <Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
android:textColor="@color/black"
android:textSize="17sp" /> </LinearLayout>

1.2ContentWriteActivity.java

package com.example.chapter07_client;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText; import com.example.chapter07_client.entity.User;
import com.example.chapter07_client.util.ToastUtil; public class ContentWriteActivity extends AppCompatActivity implements View.OnClickListener{ private EditText et_name;
private EditText et_age;
private EditText et_height;
private EditText et_weight;
private CheckBox ck_married; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_write); et_name = findViewById(R.id.et_name);
et_age = findViewById(R.id.et_age);
et_height = findViewById(R.id.et_height);
et_weight = findViewById(R.id.et_weight);
ck_married = findViewById(R.id.ck_married); findViewById(R.id.btn_save).setOnClickListener(this);
findViewById(R.id.btn_delete).setOnClickListener(this);
findViewById(R.id.btn_read).setOnClickListener(this);
} @SuppressLint("Range")
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_save:
ContentValues values = new ContentValues();
values.put(UserInfoContent.USER_NAME, et_name.getText().toString());
values.put(UserInfoContent.USER_AGE, Integer.parseInt(et_age.getText().toString()));
values.put(UserInfoContent.USER_HEIGHT, Integer.parseInt(et_height.getText().toString()));
values.put(UserInfoContent.USER_WEIGHT, Float.parseFloat(et_weight.getText().toString()));
values.put(UserInfoContent.USER_MARRIED, ck_married.isChecked());
getContentResolver().insert(UserInfoContent.CONTENT_URI, values);
ToastUtil.show(this, "保存成功");
break;
case R.id.btn_read:
Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null);
if (cursor != null) {
while(cursor.moveToNext()) {
User info = new User();
info.id = cursor.getInt(cursor.getColumnIndex(UserInfoContent._ID));
info.name = cursor.getString(cursor.getColumnIndex(UserInfoContent.USER_NAME));
info.age = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_AGE));
info.height = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_HEIGHT));
info.weight = cursor.getFloat(cursor.getColumnIndex(UserInfoContent.USER_WEIGHT));
info.married = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_MARRIED)) == 1 ? true : false;
Log.d("ning", info.toString());
}
cursor.close();
}
break;
}
}
}

1.3UserInfoContent.java

package com.example.chapter07_client;

import android.net.Uri;
import android.provider.BaseColumns; public class UserInfoContent implements BaseColumns { public static final String AUTHORITIES = "com.example.chapter07_server.provider.UserInfoProvider"; // content://com.example.chapter07_server.provider.UserInfoProvider // 访问内容提供器的URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user"); // 下面是该表的各个字段名称
public static final String USER_NAME = "name";
public static final String USER_AGE = "age";
public static final String USER_HEIGHT = "height";
public static final String USER_WEIGHT = "weight";
public static final String USER_MARRIED = "married"; }

1.4效果:

先启动server端:

控制台输出:

D/ning: UserInfoProvider onCreate

再启动client:

点“保存”:

控制台输出:

D/ning: UserInfoProvider insert

再点“读取”: 控制台输出:

D/ning: UserInfoProvider query
D/ning: User{id=1, name='Jack', age=18, height=180, weight=180.0, married=false}

再点击“保存”、“读取”,控制台输出:

D/ning: UserInfoProvider query
D/ning: User{id=1, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=2, name='Jack', age=18, height=180, weight=180.0, married=false}

2.数据删除

2.1chapter07-server应用的UserInfoProvider.java新增内容:


private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);

private static final int USERS = 1;
private static final int USER = 2;

static {
// 往Uri匹配器中添加指定的数据路径
URI_MATCHER.addURI(UserInfoContent.AUTHORITIES, "/user", USERS);
URI_MATCHER.addURI(UserInfoContent.AUTHORITIES, "/user/#", USER);
}

// content://com.example.chapter07_server.provider.UserInfoProvider/user
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.d("ning", "UserInfoProvider insert");
if (URI_MATCHER.match(uri) == USERS) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.insert(UserDBHelper.TABLE_NAME, null, values);
}
return uri;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.d("ning", "UserInfoProvider query");
if (URI_MATCHER.match(uri) == USERS) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
return db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, null);
}
return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
switch (URI_MATCHER.match(uri)) {
// content://com.example.chapter07_server.provider.UserInfoProvider/user
// 删除多行
case USERS:
SQLiteDatabase db1 = dbHelper.getWritableDatabase();
count = db1.delete(UserDBHelper.TABLE_NAME, selection, selectionArgs);
db1.close();
break;
// content://com.example.chapter07_server.provider.UserInfoProvider/user/2
// 删除单行
case USER:
String id = uri.getLastPathSegment();
SQLiteDatabase db2 = dbHelper.getWritableDatabase();
count = db2.delete(UserDBHelper.TABLE_NAME, "_id=?", new String[]{id});
db2.close();
break;
}

return count;
}

2.2charpter07-client应用的清单文件,新增内容:

<!-- 出于安全考虑,Android 11 要求应用事先说明需要访问的其他软件包 -->
<queries>
<package android:name="com.example.chapter07_server"/>
</queries>

2.3charpter07-client应用的ContentWriteActivity.java中新增内容:

@SuppressLint("Range")
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_save:
ContentValues values = new ContentValues();
values.put(UserInfoContent.USER_NAME, et_name.getText().toString());
values.put(UserInfoContent.USER_AGE, Integer.parseInt(et_age.getText().toString()));
values.put(UserInfoContent.USER_HEIGHT, Integer.parseInt(et_height.getText().toString()));
values.put(UserInfoContent.USER_WEIGHT, Float.parseFloat(et_weight.getText().toString()));
values.put(UserInfoContent.USER_MARRIED, ck_married.isChecked());
getContentResolver().insert(UserInfoContent.CONTENT_URI, values);
ToastUtil.show(this, "保存成功");
break;
case R.id.btn_read:
Cursor cursor = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null);
if (cursor != null) {
while(cursor.moveToNext()) {
User info = new User();
info.id = cursor.getInt(cursor.getColumnIndex(UserInfoContent._ID));
info.name = cursor.getString(cursor.getColumnIndex(UserInfoContent.USER_NAME));
info.age = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_AGE));
info.height = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_HEIGHT));
info.weight = cursor.getFloat(cursor.getColumnIndex(UserInfoContent.USER_WEIGHT));
info.married = cursor.getInt(cursor.getColumnIndex(UserInfoContent.USER_MARRIED)) == 1 ? true : false;
Log.d("ning", info.toString());
}
cursor.close();
}
break;
case R.id.btn_delete: // 单行删除:
// content://com.example.chapter07_server.provider.UserInfoProvider/user/2
// Uri uri = ContentUris.withAppendedId(UserInfoContent.CONTENT_URI, 10);
// int count = getContentResolver().delete(uri, null, null); // 多行删除:
// content://com.example.chapter07_server.provider.UserInfoProvider/user
int count = getContentResolver().delete(UserInfoContent.CONTENT_URI, "name=?", new String[]{"Jack"});
if (count > 0) {
ToastUtil.show(this, "删除成功");
}
break;
}
}

2.4charpter07-client及charpter07-server应用的UserInfoContent.java新增内容:

public static final String AUTHORITIES = "com.example.chapter07_server.provider.UserInfoProvider";

    // content://com.example.chapter07_server.provider.UserInfoProvider

    // 访问内容提供器的URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");

2.5效果:

2.5.1单条删除:

点“读取”:

D/ning: User{id=8, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=9, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=10, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=11, name='Jack', age=18, height=180, weight=180.0, married=false}

点“删除”,删除id=10的,再点“读取”,可以看到id=10的已经被删除了:

D/ning: User{id=8, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=9, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=11, name='Jack', age=18, height=180, weight=180.0, married=false}

2.5.2多条删除:

点“读取”:

D/ning: User{id=8, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=9, name='Jack', age=18, height=180, weight=180.0, married=false}
D/ning: User{id=11, name='Jack', age=18, height=180, weight=180.0, married=false}

点“删除”,删除所有名字等于"Jack"的,再点“读取”,可以看到全都删除了(因为名字都等于Jack):

(备注:这里直接点“读取”,会报WaitForGcToComplete blocked Instrumentation on None for 6.246ms。所以我采用先点一下“保存”,再点“读取”的方式。查出来id=12,说明点击“删除”时,当时所有name=Jack的记录即id=8,9,11的,已经都被删掉了。)

D/ning: User{id=12, name='Jack', age=18, height=180, weight=180.0, married=false}

2022-11-22学习内容-Client端代码编写-数据删除的更多相关文章

  1. HBase 协处理器编程详解第一部分:Server 端代码编写

    Hbase 协处理器 Coprocessor 简介 HBase 是一款基于 Hadoop 的 key-value 数据库,它提供了对 HDFS 上数据的高效随机读写服务,完美地填补了 Hadoop M ...

  2. Python自动化之rabbitmq rpc client端代码分析(原创)

    RPC调用client端解析 import pika import uuid # 建立连接 class FibonacciRpcClient(object): def __init__(self): ...

  3. 新兵易学,老兵易用----C++(C++11的学习整理---如何减少代码量,加强代码的可读性)

    1.auto类型推导 auto推导最大的优势就是在拥有初始化表达式的复杂类型变量声明时简化代码. auto第二个优势就是免去了程序员在一些类型声明时的麻烦,或者避免一些在类型声明时的错误. auto第 ...

  4. Seata 1.5.2 源码学习(Client端)

    在上一篇中通过阅读Seata服务端的代码,我们了解到TC是如何处理来自客户端的请求的,今天这一篇一起来了解一下客户端是如何处理TC发过来的请求的.要想搞清楚这一点,还得从GlobalTransacti ...

  5. WEB学习笔记4-前端代码基本命名规法和格式规范

    1.HTML命名规范及格式规范 标签名和属性应该都小写,虽然HTML代码不区分大小写:属性值应该用双引号闭合. <IMG src=demo.jpg alt='test'/>(N) < ...

  6. tls 双向认证 client端代码例子

    example: python import httplib import json import ssl import urllib2 import requests CA_FILE = " ...

  7. swoole 异步非堵塞 server/端 client/端 代码,已经测试完毕。贴代码

    服务器环境  centos7.0  swoole4.3 php7.2 pcre4.8  nginx1.8   php-fpm server.php <?php class Server { pr ...

  8. dubbo入门学习 五 provider端的编写

    1. 新建Maven Project, 里面只有接口(dubbo-service) 1.1 为什么这么做? RPC框架,不希望Consumer知道具体实现.如果实现类和接口在同一个项目中,Consum ...

  9. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  10. VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt

    VB6查看桌面分辨率和工作区大小 2022.08.22 name.vt Form1 内代码如下: ' 2022年8月22日 15时15分 ' 作者:name.vt Private Sub cmdCle ...

随机推荐

  1. CF1781D 解题乱弹

    abc1057510554 老师说,搞这种数论题,就可以在 CF 上 number theory 板刷一个 1300-1900 就可以了. 然后发现连 1800 的题都做不出来,我可以退役力 QAQ ...

  2. element-ui/lib/style.css in ./src/main.js 解决方案

    在node_modules 中    找到element-ui/lib路径 创建style.css文件   就好了

  3. 基于Python的OpenGL 04 之变换

    1. 概述 本文基于Python语言,描述OpenGL的变换 前置知识可参考: 基于Python的OpenGL 03 之纹理 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里 ...

  4. sqlite3数据库Linux 系统移植和使用

    sqlite3数据库是一个小型的数据库,当数据量不大,要求不是特别高的时候,是个不错的选择. 在Linux上移植和使用也非常的方便. 本示例是在硬件全志r528 .linux5.4 上验证的. 移植操 ...

  5. DataTransfer.setDragImage()自定义拖拽图像遇到的坑

    发生拖动时,从拖动目标(dragstart事件触发的元素)生成半透明图像,并在拖动过程中跟随鼠标指针.这个图片是自动创建的,你不需要自己去创建它.然而,如果想要设置为自定义图像,那么 DataTran ...

  6. TDSQL-C Serverless 服务是如何实现通过接入层来实现恢复感知

    在一些极限的测试场景下,数据库实例会频繁的自动启停,这时候如何保证数据库实例停止后快速恢复呢?如何保证在恢复数据库实例时无需用户重复链接,直到恢复访问? 站在用户的角度考虑,谁都不希望数据库每次启停都 ...

  7. ionic4 可能忽略的一些细节

    1.iOS中,页面被状态栏遮挡的问题 有的说 具体是解决是  在config.xml   配置如下代码 <preference name="StatusBarStyle"   ...

  8. s-hr实现单点登录,看我这份笔记就够了!!!

    https://pan.kingdee.com/s/MTA5ODk4NyxjNzk1来自:云之家企业云盘

  9. grafana嵌入iframe,websoket连接报错400或403(nginx代理)

    1.custom.ini配置文件修改allowed_origins=* 2. nginx中增加配置,如下:

  10. .net5的安装部署条件

    1.安装vs2019最新版本 2.安装 .net5最新版本的的Hosting Bundle 下载地址:https://dotnet.microsoft.com/download/dotnet/5.0 ...