【Android】安卓四大组件之ContentProvider知识总结
文章目录
- Uri
- 介绍
- 组成
- ContentResolver
- 用法
- 获取对象
- 增删改查
- 读取联系人
- 获取权限
- 配置ListView
- ContentProvider
- 方法
- 步骤
- 1、注册
- 2、继承
- onCreate
- UriMatcher
- insert
- delete
- update
- query
- getType
- ContentProvider与ContentResolver
Uri
介绍
统一资源标识符(URI)是一种用于标识资源的字符串。它可以是一个网址、文件路径、或其他形式的资源定位符。在Android中,URI通常用于访问内容提供者(Content Provider)提供的数据。
举例:
-
获取设备上存储的所有图片
content://media/internal/images
-
获取设备上所有联系人信息
content://contacts/people/
-
获取ID为45的单个联系人信息
content://contacts/people/45
在Java中,可以通过Uri.parse
方法将字符串URI转换为Uri对象。
Uri uri = Uri.parse("content://contacts/people/45");
组成
- Scheme:
- 采用前缀
content://
,表示这是一个内容提供者的Uri
。 - 例如:
content://
- 采用前缀
- Authority:
- 通常采用应用程序的包名,这样可以确保其唯一性。
- 例如:
com.example.provider
- Path:
- 指定数据或资源的路径,可以包含具体的表名、资源名以及其他标识符。
- 例如:
/student/1
ContentResolver
ContentResolver
是 Android 框架提供的一个类,用于与内容提供者(Content Provider)交互,提供了一系列增删改查的方法对数据进行操作,这些方法以Uri
的形式对外提供数据
用法
ContentResolver
为应用程序提供了统一的接口来访问不同的ContentProvider
获取对象
使用getContentResolver()
方法获取ContentResolver
对象:
ContentResolver contentResolver = getContentResolver();
增删改查
-
增
Uri insert(Uri uri, ContentValues values);
插入新数据,并返回新插入数据的URI。
ContentValues
对象,包含了要插入的数据键值对
-
删
int delete(Uri uri, String selection, String[] selectionArgs);
删除匹配条件的数据,并返回删除的行数。
selection
: SQLWHERE
子句的筛选条件(不包括WHERE
关键字)。用来确定哪些行会被删除。selectionArgs
: 选择条件的参数数组。用于替代selection
中占位符(?
)
-
改
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);
更新匹配条件的数据,并返回更新的行数。
-
查
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
查询数据,并返回一个
Cursor
对象。projection
: 指定你要返回的列。如果你想返回所有列,可以传入null
。sortOrder
: 指定排序的方式。
读取联系人
获取通讯录的数据
使用 ContentResolver
来访问系统通讯录中的数据
获取权限
在AndroidMainfest获取权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
配置ListView
在MainActivity中配置ListView
public class MainActivity extends AppCompatActivity {// ArrayAdapter用于在ListView中显示联系人列表ArrayAdapter<String> adapter;// 存储联系人名称和电话号码的列表List<String> contactsList = new ArrayList<>();// 获取ListViewprivate ListView listView;// 设置布局,请求权限,初始化ListView和Adapter。@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.contacts_view);adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, contactsList);listView.setAdapter(adapter);// 检查是否已经获得了读取联系人的权限if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 如果没有,请求该权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);} else {// 如果已经获得,直接读取联系人readContacts();}}// 没有权限弹出对话框:如果权限被授予,读取联系人;否则显示提示信息@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);// 检查是否是READ_CONTACTS权限的请求结果if (requestCode == 1) {// 检查权限是否被授予if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 如果被授予,读取联系人readContacts();} else {// 如果未被授予,显示提示信息Toast.makeText(this, "联系人权限获取失败", Toast.LENGTH_SHORT).show();}}}// 查询并读取设备上的联系人列表。将查询结果添加到contactsList中,并更新Adapter以显示结果。private void readContacts() {Cursor cursor = null;try {// 查询联系人数据cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);if (cursor != null) {// 遍历查询结果while (cursor.moveToNext()) {// 获取联系人名称和电话号码的列索引int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);// 检查列索引是否有效if (nameIndex != -1 && numberIndex != -1) {// 获取联系人名称和电话号码String displayName = cursor.getString(nameIndex);String number = cursor.getString(numberIndex);// 将名称和号码组合后添加到列表contactsList.add(displayName + "\n" + number);}}// 更新Adapter以显示新的联系人列表adapter.notifyDataSetChanged();}} catch (Exception e) {e.printStackTrace();} finally {// 关闭Cursor,释放资源if (cursor != null) {cursor.close();}}}
}
ContentProvider
内容提供者(Content Provider)是 Android 四大组件之一(Activity、Service、Broadcast Receiver、Content Provider)。它用于在不同的应用之间共享数据,尤其是在进程间通信(IPC)中起着关键作用。内容提供者通过一层中介来控制数据访问,从而确保隐私数据的安全性。
内容提供者本身并不直接存储数据,它只是定义了数据的访问接口。数据的实际存储方式包括文件存储,SharedPreferences 存储,SQLite 数据库存储
方法
创建一个自定义的 ContentProvider
类继承ContentProvider
涉及实现一些关键的方法
onCreate()
方法:用于初始化ContentProvider
通常会执行一些初始化操作,比如设置数据库的连接等getType()
方法:返回给定Uri
的 MIME 类型,以便系统知道如何处理数据insert()
方法:用于向ContentProvider
中插入数据update()
方法:用于更新ContentProvider
中的数据delete()
方法:用于删除ContentProvider
中的数据query()
方法:用于查询ContentProvider
中的数据
步骤
1、注册
创建一个ContentProvider
类,as会自动在AndroidManifest.xml
中注册
<providerandroid:name=".MyContentProvider"android:authorities="com.example.sqlitedatabasepractice_731"android:enabled="true"android:exported="true"></provider>
2、继承
继承了ContentProvider,得到了6个要重写的方法
onCreate
private SQLiteDatabase db;// 初始化public boolean onCreate() {// 这里是根据自定义的UserDBHelper类的自定义构造方法创建一个UserDBHelper类的对象// 然后调用其方法获取SQLiteDatabase类的对象UserDBHelper dbHelper = new UserDBHelper(getContext());db = dbHelper.getWritableDatabase();return true;}
UriMatcher
用于根据 URI 来匹配请求,帮助
ContentProvider
解析 URI,并确定应该执行的操作或返回的数据
// UriMatcher用于URI的匹配
private static UriMatcher uriMatcher;
// 静态代码块,初始化 UriMatcher 实例和添加匹配规则
static {// 为UriMatcher添加匹配规则uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 添加匹配规则,匹配所有以 BASE_PATH 结尾的 URIuriMatcher.addURI(AUTHORITY, BASE_PATH, USER_DIR);// 添加匹配规则,匹配以 BASE_PATH 结尾,后跟一个 ID 的 URIuriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", USER_ITEM);
}
insert
public Uri insert(Uri uri, ContentValues values) {// 插入一条新记录long id = db.insert(UserDBHelper.TABLE_NAME, null, values);// 构造新记录的URI并用来返回Uri insertedUri = Uri.withAppendedPath(CONTENT_URI, String.valueOf(id));return insertedUri;}
delete
public int delete(Uri uri, String selection, String[] selectionArgs) {int match = uriMatcher.match(uri);int count = 0;switch (match) {case USER_DIR:// 删除满足条件的所有记录count = db.delete(UserDBHelper.TABLE_NAME, selection, selectionArgs);break;case USER_ITEM:// 删除指定ID的记录String id = uri.getLastPathSegment();count = db.delete(UserDBHelper.TABLE_NAME, "id = ?", new String[]{id});break;}return count;}
update
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {int count = 0;switch (uriMatcher.match(uri)) {case USER_DIR:// 更新满足条件的所有记录count = db.update(UserDBHelper.TABLE_NAME, values, selection, selectionArgs);break;case USER_ITEM:// 更新指定ID的记录String id = uri.getLastPathSegment();count = db.update(UserDBHelper.TABLE_NAME, values, "id = ?", new String[]{id});break;}return count;}
query
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {Cursor cursor = null;switch (uriMatcher.match(uri)) {case USER_ITEM:// 查询指定ID的记录String id = uri.getLastPathSegment();cursor = db.query(UserDBHelper.TABLE_NAME, projection, "id = ?", new String[]{id}, null, null, sortOrder);break;case USER_DIR:// 查询所有记录cursor = db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);break;}return cursor;}
getType
public String getType(Uri uri) {// MINE类型说明// 字符串取值,让ANDROID系统知道处理的是整体数据还是单条数据// 特点:1.以vnd开头// 2.如果Uri以路径形式结尾,后面接android.cursor.dir/,返回的是整个数据表的MIME类型// 如果Uri以ID形式结尾,后面接android.cursor.item/,返回的是单个数据项的MIME类型// 3.最后接的内容是: vnd.<authority>.<path>switch (uriMatcher.match(uri)) {case USER_DIR:// 返回整个数据表的MIME类型return "vnd.android.cursor.dir/vnd." + AUTHORITY + "." + BASE_PATH;case USER_ITEM:// 返回单个数据项的MIME类型return "vnd.android.cursor.item/vnd." + AUTHORITY + "." + BASE_PATH;default:return null;}}
ContentProvider与ContentResolver
ContentResolver
间接调用ContentProvider
ContentProvider
操作自己的DataBase数据库
ContentResolver
间接调用 ContentProvider
:
ContentResolver
是用于访问和管理数据的工具,它将操作请求(如insert()
,update()
,delete()
,query()
)发送到对应的ContentProvider
。ContentResolver
通过URI
定位到具体的ContentProvider
,并调用其方法来执行实际的数据操作。
ContentProvider
操作自己的数据库:
ContentProvider
实现了对数据的 CRUD 操作,它会直接与应用程序的数据库进行交互,执行插入、更新、删除和查询等操作。ContentProvider
在这些操作中使用数据库访问对象(如SQLiteDatabase
),并根据URI
和其他参数来确定需要操作的数据。
比如:
delete()
方法处理删除请求,通过ContentResolver
转发到具体的ContentProvider
实现,执行删除操作并返回删除的记录数。当你在自定义的
ContentProvider
中实现delete()
方法时,它需要接收来自其他应用程序通过ContentResolver
传递的删除请求。你需要根据传递的 URI 和选择条件删除数据库中的记录,并返回删除的记录数
ContentProvider` 实现了对数据的 CRUD 操作,它会直接与应用程序的数据库进行交互,执行插入、更新、删除和查询等操作。
ContentProvider
在这些操作中使用数据库访问对象(如SQLiteDatabase
),并根据URI
和其他参数来确定需要操作的数据。
比如:
delete()
方法处理删除请求,通过ContentResolver
转发到具体的ContentProvider
实现,执行删除操作并返回删除的记录数。当你在自定义的
ContentProvider
中实现delete()
方法时,它需要接收来自其他应用程序通过ContentResolver
传递的删除请求。你需要根据传递的 URI 和选择条件删除数据库中的记录,并返回删除的记录数
感谢您的阅读
如有错误烦请指正
相关文章:
【Android】安卓四大组件之ContentProvider知识总结
文章目录 Uri介绍组成 ContentResolver用法获取对象增删改查读取联系人获取权限配置ListView ContentProvider方法步骤1、注册2、继承onCreateUriMatcherinsertdeleteupdatequerygetType ContentProvider与ContentResolver Uri 介绍 统一资源标识符(URI)…...
盘点一下这几个月以来的大事记吧~图欧学习资源库更新日志(2022年5月~10月)含资源
大家好,我是TUO图欧君!好久不见~ 这几个月以来我都干了什么呢?到底是因为什么事情拖更呢?咳咳……说来话长……总的来说,更加完善了图欧学习资源库网站,并且升级了三大网盘的内容空间,资源更加…...
Prometheus 采集Apache Kafka指标
Monitoring Your Event Streams: Integrating Confluent with Prometheus and GrafanaMonitoring Your Event Streams: Tutorial for Observability Into Apache Kafka Clients...
我在高职教STM32——EXTI之外部按键中断(2)
大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…...
SpringBoot整合Knife4j接口文档
1. 在项目入口模块pom文件导入依赖 <!-- knife4j(API 文档工具) --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>${knife4j…...
汇编语言代码中以A-F开头的十六进制数前需要加0
汇编语言的语法细节非常多; 在汇编语言代码中,以A-F开头的十六进制数前需要加0以避免被识别为助记符。 如下图, MOV AL, AFH, 这样将报错; AFH的前面加0就对了,运行如下, 如果写成 M…...
深拷贝——JSON.stringify()序列化和JSON.prase()反序列化
为什么要使用深拷贝? 1、简单理解 JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于处理 JSON 数据的两个内置方法 使用深拷贝的主要原因是为了创建一个对象或数组的完全独立副本,这样对副本的任何更改都不会影响到原始数据。 在 JavaScript …...
基于SpringBoot+Vue的校园便利平台(带1w+文档)
基于SpringBootVue的校园便利平台(带1w文档) 基于SpringBootVue的校园便利平台(带1w文档) 本平台采用B/S架构、采用的数据库是MySQL,使用JAVA技术开发。该平台的开发方式无论在国内还是国外都比较常见,而且开发完成后使用普遍,可以给平台用户…...
计算机技术基础 (bat 批处理)Note6
计算机技术基础 (bat 批处理)Note6 本节主要讲解FOR命令语句(循环)在 bat 批处理中的使用 (part 2) 变量延迟 命令语句 在没有开启变量延迟的情况下,批处理命令行中的变量改变,必须到下一条命令才能体现…...
rust 桌面 sip 软电话(基于tauri 、pjsip库)
本文尝试下rust 的tauri 桌面运用 原因在于体积小 1、pjsip 提供了rust 接口官方的 rust demo 没编译出来 在git找了个sip-phone-rs-master https://github.com/Charles-Schleich/sip-phone-rs 可以自己编译下pjsip lib库替换该项目的lib 2、创建一个tauri demo 引用 [depe…...
求最短路径的基本方法——SPFA(贝尔曼-福特算法的优化算法)
文章目录 前篇SPFA算法SPFA算法介绍浅谈SPFA算法经典例题题目来源思路code 前篇 关于Floyd算法与Dijkstra算法—>点击这里 SPFA算法 SPFA算法介绍 SPFA算法是求解单源最短路径问题的一种算法,由理查德贝尔曼(Richard Bellman) 和 莱斯…...
PHP框架详解之Symfony框架
一、框架概述 起源与开发者:Symfony由SensioLabs(现为Symfony公司)开发,最初由Fabien Potencier于2005年创建。功能定位:Symfony通过提供一套可重用的组件和标准化的框架,帮助开发者快速构建Web应用、API、…...
dctcp 比 reno,cubic 好在哪
dctcp 相比标准 aimd 如 reno,cubic 到底好在哪,理论上讲 dctcp 本质上也是 aimd 算法,但它的 cwnd 根据 mark rate 来实时缩放,而标准 reno/cubic 则一致缩放 β 0.5(reno) or β 0.3(cubic),直观上看 dctcp 是连续…...
嵌入式:简单的UI框架
1:UI框架简介 除了服务框架外,我们还需要对外显示UI,所以我们就需要一个UI的框架,跟服务框架一样,不用这个UI框架我们也是可以实现,但是这样每个人写的UI都会有差异,需要的事件,数据…...
vantUI中的van-form使用 vue2版本
使用submit"onSubmit"提交,然后button按钮native-type"submit"提交,单个form的时候没有问题,但是多个form组件多次点击的时候就容易出现混乱提交 <van-form submit"onSubmit"><van-fieldv-model&quo…...
P3366 【模板】最小生成树(洛谷)
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。 接下来 M 行每行包含三个整数 Xi,Yi,Zi,表…...
面向对象+线程+集合类面试题(Java)
面向对象编程OOP Java是一个支持并发,基于类和面向对象的计算机汇编语言, 面向对象软件开发的优点是: 代码开发模块化,易于维护和修改 代码复用 增强代码的可靠性和灵活性 增强代码的可理解性 面向对象编程有很多重要的特性,比如:封装…...
2024年最新Pycharm激活码 | 免费获取
直接分享给你拿来用!(亲测有效) 如何激活? 安装好Pycharm后直接点击Pycharm激活就可以使用了 获取方式(100%免费)...
MATLAB在算法处理上的作用
MATLAB在算法处理上的作用 引言 MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能语言及其交互环境,广泛应用于数学计算、算法开发、数据分析、仿真建模等领域。其强大的计算能力、丰富的工具箱和高效的可视化功能使其在算法处…...
Spingboot请求tcp 方式
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel;/*** 请求tcp接口** author Mr丶s* date 2024/7/1…...
TS中什么是字面量类型?
在TypeScript(TS)中,字面量类型(Literal Types)是指那些与特定字面量值严格对应的类型。这些字面量值可以是字符串、数字、布尔值或符号等。字面量类型提供了一种方式来定义更精确的类型,从而增强代码的可读…...
MySQL:行级锁
MySQL中的行级锁是数据库锁机制中粒度最细的一种,它只锁定事务需要修改的数据行,而不是整个表或数据库。行级锁能够显著提高数据库的并发性能,减少锁冲突。 行级锁的类型 MySQL中的行级锁主要有以下几种类型: 记录锁(…...
visual studio跳转到上一个/下一个光标处的快捷键设置
vscode能通过Alt左右箭头跳转到上/下一个光标处,这对于“点进函数看源码,看完后跳转到原来位置”是非常方便的。 在Visual Studio中,有2种方法实现这样的功能。 第一种,直接点击这两个按钮:(缺点是每次要用…...
1、爬⾍概述
1. 什么是爬虫? 爬虫(Web Crawler)是一种通过编写程序自动访问并提取互联网上数据的技术。爬虫可以帮助我们在浏览网页时自动收集和保存一些有用的数据,例如图片、视频和文本信息。简单来说,爬虫就是自动化的浏览器。…...
vim列编辑模式
在编辑文本时,经常会有这样的需求,对特定列进行进行批量编辑。比如批量注释一段代码,或者删除待定字符(如一列空格)。幸运的是VIM支持列编辑模式。 假设文本内容: Maximum length of a custom vocabulary…...
Python初学者必须掌握的基础知识点
Python初学者必须掌握的基础知识点包括数据类型与变量、控制结构(条件语句和循环语句)、基本数据结构(列表、元组、字典、集合)、函数与模块、以及字符串处理等。以下是对这些基础知识点及其对应代码的详细介绍: 1. …...
[CP_AUTOSAR]_系统服务_DEM模块(一)功能及模块间依赖关系介绍
目录 1、DEM 功能介绍2、DEM 与其它模块的依赖关系 在前面 《分层软件架构_内容详解》文中,简要介绍了CP_AUTOSAR 系统服务(System Services)所包含的内容块,本文将介绍系统服务中的DEM(诊断事件管理模块)…...
设计模式在金融领域的应用案例教程
设计模式在金融领域的应用案例教程 欢迎来到设计模式在金融领域应用的案例教程!本教程旨在帮助开发者理解和应用各种设计模式,通过实际的金融业务场景来展示每种模式的使用方法和优势。 > 项目地址-设计模式在金融领域的应用案例教程 目录 简介设…...
ECMA6Script学习笔记(六)
【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要:文章深入探讨了ES6模块化处理,强调模块化在提高代码可维护性、可复用性和可扩展性方面的重要性。介绍了ES6模块化的三种导出方式:分别导出、统一导出和默认导出,并通过具体的代码示例…...
算法通关:014_1:用栈实现队列
文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…...
Android studio配置代码模版
一、背景: 在工作中,总是要写一些重复的代码,特别是项目有相关规范时,就会产生很多模版代码,每次要么复制一份,要么重新写一份新的,很麻烦,于是我就在想,能不能像创建一…...
人工智能幻觉:记忆能找到答案吗?
欢迎来到雲闪世界。探索记忆机制如何减轻大型语言模型中的幻觉。 幻觉是事实,不是错误;错误的是基于幻觉的判断。——伯特兰罗素 大型语言模型 (LLM)表现出色,但仍受到幻觉的困扰。特别是对于敏感应用来说,这不是一个小问题&#…...
数据工程解决的十大数据生命周期问题
欢迎来到雲闪世界。解决关键痛点的明确策略 使用Kandinsky 的AI 生成图像 在本文中,我想解决数据工程师在整个数据生命周期中使用管道时面临的一些最大挑战。了解如何管理数据生命周期是我们不断变化的领域的关键。作为一名数据工程师,我经常处理大量不同…...
通过 ACM 论文模版学习 LaTeX 语法 【三、格式】
文章目录 一、LaTeX 简介二、ACM 论文模版三、格式3.1 文章格式3.1.1 注释3.1.2 空格3.1.3 换行 3.2 字体3.2.1 字体样式3.2.2 字体大小2.2.3 字体颜色 一、LaTeX 简介 通过 ACM 论文模版学习 LaTeX 语法 【一、LaTeX简介和安装】 二、ACM 论文模版 通过 ACM 论文模版学习 L…...
C#进阶-轻量级ORM框架Dapper的使用教程与原理详解
本文详细介绍了Dapper在C#中的使用方法,包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐,适用于各种数据库操作需…...
MySQL半同步复制
1.MySQL主从复制模式 1.1异步复制 异步复制为 MySQL 默认的复制模式,指主库写 binlog、从库 I/O 线程读 binlog 并写入 relaylog、从库 SQL 线程重放事务这三步之间是异步的。 异步复制的主库不需要关心备库的状态,主库不保证事务被传输到从库…...
【Redis】浅谈架构和认识Redis
目录 架构演进 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 冷热分离架构(引入缓存) 垂直分库 微服务架构 认识Redis Redis的特性 架构演进 单机架构 简单来说就是只有一台服务器,这个服务器用来负责所有…...
如何在Linux云服务器上通过Docker Compose部署安装Halo,搭建个人博客网站?
文章目录 前置步骤环境搭建创建容器组在系统任意位置创建一个文件夹创建docker-compose.yaml启动 Halo 服务配置反向代理以及域名解析Halo初始化页面。更新新版本的halo 前置步骤 首先你需要一套linux服务器,这里默认你已经有了。如果没有可以在 云服务器优惠合集 …...
打卡第31天------贪心算法
每天抓紧时间刷题,争取尽快上岸,不能再耽误一分一秒了,2024年已经过去大半年了。这个算法编程题是我的痛点。要尽快弥补。 卡尔在讲算法题的时候,思路比较清晰,通俗易懂,以前看见算法题就害怕,因为啥都不会,看懵了,跟了一个月了,每天坚持刷题,偶尔会回顾思路,也会…...
如何获取文件缩略图(C#和C++实现)
在C中,可以有以下两种办法 使用COM接口IThumbnailCache 文档链接:IThumbnailCache (thumbcache.h) - Win32 apps | Microsoft Learn 示例代码如下: VOID GetFileThumbnail(PCWSTR path) {HRESULT hr CoInitialize(nullptr);IShellItem* i…...
GATK ReferenceContext类介绍
在 GATK(Genome Analysis Toolkit)中,ReferenceContext 是ReferenceDataSource的包装器,用于处理参考基因组数据的类。它提供了一种方便的方式来访问参考基因组中的特定区域,通常用于分析和处理变异数据。 ReferenceContext 类概述 ReferenceContext 类用于封装与参考基…...
需要遵循的 REST API 设计最佳实践
在开始 REST API 设计之前,您需要一个功能规范。它规定了系统做什么,而不是如何做。它可能包括一些模型屏幕截图和信息流程图,但它本质上是一个高级文档。相比之下,API 设计深入了解了其工作原理的本质。 快速概览 网络上有无数…...
学习大数据DAY30 python基础语法3
目录 上机练习 5 File(文件) 读写 文本文件写 文本文件读 csv 文件写 csv 文件读 异常 自定义异常 上机练习 6 上机练习 5 上机练习5的作业我昨天就写完了,但是因为它是今天的作业,我就今天发咯。 # atm 机模拟器:使用 main 入口&…...
虚拟机连接xshell的三种方式
第一 桥接 改为输入 systemctl restart network 关闭自启动防火墙 systemctl stop firewalld systemctl disable firewalld 查看本机网络信息 ifconfig 连接xshell 第二 nat 第三 仅主机...
北京全日制自闭症寄宿学校:为孩子们打开未来之门
作为星贝育园自闭症康复中心的一名教师,我一直密切关注着自闭症康复领域的发展。如今,越来越多的自闭症机构采取寄宿制的方案,这一趋势在北京尤为明显。 在北京,全日制自闭症寄宿学校展现出了诸多显著的优势。首先&#x…...
Linux常用操作补充
文章目录 yumsystemctl修改主机名修改hosts修改环境变量nohupcrontabssh时区配置sedawk yum 基本使用 安装:yum install 包名 yum install telnet卸载:需要借助rpm进行卸载 换源 参考https://developer.aliyun.com/mirror/centos?spma2c6h.13651102.0…...
Unity Yaml
资料 UnityYaml 项目设置 选择用于存储序列化资产的格式 Project Settings->Asset Serialization->Mode Force Text 序列化为文本文件,例如场景文件 保存为yaml格式 方便查看;版本控制时文本文件比二进制文件更容易合并Force Binary 序列化为二进制文件&a…...
UNI-APP_点击,长按,触摸,结束触摸事件
touchstartEventHandle手指触摸动作开始字节跳动小程序不支持touchmoveEventHandle手指触摸后移动字节跳动小程序不支持touchendEventHandle手指触摸动作结束字节跳动小程序不支持touchcancelEventHandle手指触摸动作被打断,如来电提醒,弹窗字节跳动小程…...
Linux进程 (冯诺依曼体结构 管理 PCB 进程状态 僵尸进程 孤儿进程 运行阻塞挂起状态 进程优先级)
文章目录 一.冯诺依曼体系结构冯诺依曼结构能干什么? 二.操作系统概念结构图(不完整)为什么要有操作系统? 尝试理解操作系统管理结构图(完整)总结: 三.进程进程是什么?PCB为什么要有PCB? Linux中的PCB进程的task_struc…...
Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 可以使用Lasso回归进行特征选择,尽管它本质上是一个用于回归问题的技术,但通过…...