Android学习总结之Room篇
一、Room 框架基础
1. 实体类(Entity)
实体类用于描述数据库表的结构。通过使用 @Entity
注解,可以将一个 Java 类映射到数据库中的一张表。例如,以下是一个简单的 User
实体类:
import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity
public class User {@PrimaryKey(autoGenerate = true)public int id;public String name;public int age;
}
在这个例子中,@Entity
注解将 User
类标记为数据库实体,@PrimaryKey
注解指定了 id
字段为主键,并且 autoGenerate = true
表示主键将自动生成。
2. 数据访问对象(DAO)
DAO 接口定义了对数据库的操作方法。通过使用 @Query
、@Insert
、@Update
和 @Delete
等注解,可以方便地执行 SQL 查询和数据的增删改操作。以下是一个简单的 UserDao
接口示例:
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;import java.util.List;@Dao
public interface UserDao {@Insertvoid insertUser(User user);@Query("SELECT * FROM User")List<User> getAllUsers();
}
在这个例子中,@Insert
注解用于插入数据,@Query
注解用于执行 SQL 查询语句。
3. 数据库类(Database)
数据库类负责创建和管理数据库实例。通过继承 RoomDatabase
类,并使用 @Database
注解指定实体类和数据库版本,可以创建一个 Room 数据库。以下是一个简单的 AppDatabase
类示例:
import androidx.room.Database;
import androidx.room.RoomDatabase;@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract UserDao userDao();
}
在这个例子中,@Database
注解指定了 User
类为数据库实体,版本号为 1。userDao()
方法用于获取 UserDao
实例。
二、Room 中实现 Entity 嵌套 Entity 创建相应的表
1. 定义相关实体类
假设我们有一个Author
(作者)实体类和一个Book
(书籍)实体类,每一个Author
可以有多本Book
,我们希望在查询Author
时能同时获取其相关的Book
信息。
Author
实体类
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import java.util.List;@Entity
public class Author {@PrimaryKeypublic int id;public String name;// 这里的books是与该作者相关的书籍列表,在后续会通过@Relation注解关联public List<Book> books;
}
Book
实体类
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;@Entity(foreignKeys = @ForeignKey(entity = Author.class,parentColumns = "id",childColumns = "authorId"))
public class Book {@PrimaryKeypublic int id;public String title;// 关联作者的idpublic int authorId;
}
2. 定义包含关系的 POJO(Plain Old Java Object)类
为了更好地处理嵌套关系,我们创建一个 POJO 类,用于将Author
和其相关的Book
进行组合。
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;public class AuthorWithBooks {// 将Author实体类嵌入到AuthorWithBooks中@Embeddedpublic Author author;// 通过外键关联,获取与该作者相关的书籍列表@Relation(parentColumn = "id",entityColumn = "authorId")public List<Book> books;
}
在上述代码中:
@Embedded
注解用于将一个实体类嵌入到另一个类中,这里将Author
实体嵌入到AuthorWithBooks
中。@Relation
注解用于定义两个实体之间的关系,parentColumn
指定父实体(这里是Author
)的列,entityColumn
指定子实体(这里是Book
)的列,通过这两个列的关联来获取相关数据。
3. 定义数据访问对象(DAO)接口
在 DAO 接口中定义查询方法,用于获取AuthorWithBooks
数据。
import androidx.room.Dao;
import androidx.room.Query;import java.util.List;@Dao
public interface AuthorDao {@Query("SELECT * FROM Author")List<AuthorWithBooks> getAuthorsWithBooks();
}
这里的查询语句只是简单地从Author
表中查询数据,Room 会根据AuthorWithBooks
类中的关系注解,自动关联并获取相关的Book
数据。
4. 定义 Room 数据库类
import androidx.room.Database;
import androidx.room.RoomDatabase;@Database(entities = {Author.class, Book.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract AuthorDao authorDao();
}
5. 使用示例
import androidx.room.Room;public class MainActivity {public static void main(String[] args) {AppDatabase db = Room.databaseBuilder(, AppDatabase.class, "my - database").build();AuthorDao authorDao = db.authorDao();List<AuthorWithBooks> authorsWithBooks = authorDao.getAuthorsWithBooks();for (AuthorWithBooks authorWithBooks : authorsWithBooks) {System.out.println("作者:" + authorWithBooks.author.name);for (Book book : authorWithBooks.books) {System.out.println(" 书籍:" + book.title);}}}
}
三、Room的多表查询
1. 多表查询 SQL 语句示例(以常见的 MySQL 为例,假设存在学生表 students、课程表 courses、成绩表 scores)
假设 students 表有字段 id(学生编号)、name(学生姓名);courses 表有字段 id(课程编号)、course_name(课程名称);scores 表有字段 id(成绩记录编号)、student_id(关联学生表的学生编号)、course_id(关联课程表的课程编号)、score(成绩) 。
要查询每个学生的姓名、所选课程名称以及对应的成绩,SQL 语句如下:
SELECT s.name,c.course_name,sc.score
FROM students s
-- 使用INNER JOIN(内连接)关联成绩表scores
JOIN scores sc ON s.id = sc.student_id
-- 使用INNER JOIN关联课程表courses
JOIN courses c ON sc.course_id = c.id;
解释:
SELECT
子句指定要查询的列,这里选择学生姓名s.name
、课程名称c.course_name
和成绩sc.score
。FROM
子句指定主表,这里以students
表为主表,起别名s
。JOIN
用于连接其他表,ON
子句指定连接条件。第一个JOIN
将students
表和scores
表通过学生编号关联起来;第二个JOIN
将scores
表和courses
表通过课程编号关联起来,从而实现多表数据的联合查询。
2. 使用 Room(Android 中的数据库框架)实现类似多表查询
首先,定义相关的实体类:
- 学生实体类 Student:
import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity
public class Student {@PrimaryKeypublic int id;public String name;
}
- 课程实体类 Course:
import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity
public class Course {@PrimaryKeypublic int id;public String course_name;
}
- 成绩实体类 Score:
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.PrimaryKey;@Entity(foreignKeys = {@ForeignKey(entity = Student.class, parentColumns = "id", childColumns = "student_id"),@ForeignKey(entity = Course.class, parentColumns = "id", childColumns = "course_id")
})
public class Score {@PrimaryKeypublic int id;public int student_id;public int course_id;public int score;
}
然后,定义数据访问对象(DAO)接口,在其中定义查询方法:
import androidx.room.Dao;
import androidx.room.Query;import java.util.List;@Dao
public interface ScoreDao {@Query("SELECT s.name, c.course_name, sc.score " +"FROM Student s " +"JOIN Score sc ON s.id = sc.student_id " +"JOIN Course c ON sc.course_id = c.id")List<Object[]> getStudentCourseScore();
}
这里的 @Query
注解中写的 SQL 语句和前面纯 SQL 的多表查询思路一致。由于查询结果涉及多个表的不同列,返回类型定义为 List<Object[]>
,每一个 Object[]
数组代表一条查询结果记录,数组中的元素依次对应查询的列(学生姓名、课程名称、成绩) 。
在使用时,通过 Room 数据库实例获取 ScoreDao
的实例并调用该查询方法:
import androidx.room.Room;public class MainActivity {public static void main(String[] args) {AppDatabase db = Room.databaseBuilder(, AppDatabase.class, "my - database").build();ScoreDao scoreDao = db.scoreDao();List<Object[]> result = scoreDao.getStudentCourseScore();for (Object[] row : result) {String studentName = (String) row[0];String courseName = (String) row[1];int studentScore = (int) row[2];System.out.println("学生:" + studentName + ",课程:" + courseName + ",成绩:" + studentScore);}}
}
四、Room 与直接使用 SQLite 的区别
易用性
- Room:作为 Google 官方提供的在 Android 平台上操作数据库的抽象层框架,它对 SQLite 进行了封装,使用起来更加简洁和直观。例如,定义实体类时,只需使用注解(如
@Entity
、@PrimaryKey
等)来标识表结构和主键等信息,无需手动编写复杂的建表 SQL 语句;在数据访问对象(DAO)中,通过@Query
注解编写 SQL 语句,或者使用框架提供的一些内置方法(如insert
、update
、delete
等)来操作数据库,大大简化了开发流程。 - SQLite:直接使用 SQLite 时,需要开发者手动编写各种 SQL 语句来完成建表、插入、查询、更新和删除等操作,例如创建表时要完整地编写
CREATE TABLE
语句,包含列名、数据类型、约束条件等,相对来说对开发者的 SQL 知识要求较高,代码编写也更为繁琐。
代码结构
- Room:有助于构建清晰、可维护的代码结构。它将数据库操作相关的代码划分为实体类(Entity)、数据访问对象(DAO)和数据库类(Database)。实体类用于描述数据库表中的数据结构,DAO 接口定义了对数据库的操作方法,数据库类则负责创建和管理数据库实例。这种分层的设计使得代码职责明确,易于理解和维护,符合现代 Android 开发的架构规范。
- SQLite:直接使用 SQLite 时,代码结构相对较为松散,开发者可能会将 SQL 语句分散在不同的业务逻辑代码中,随着项目的增大,代码的可读性和可维护性会逐渐降低,难以快速定位和修改数据库相关的代码。
功能特性
- Room:提供了许多实用的功能特性。比如,支持数据库版本管理,当数据库结构发生变化时,可以方便地进行版本升级,并在升级过程中执行相应的迁移操作;还支持关系映射,通过
@Relation
注解可以方便地处理表与表之间的关联关系,实现多表查询和数据的嵌套加载,如在一个实体类中嵌套另一个实体类的集合。 - SQLite:本身是一个轻量级的数据库引擎,仅提供基本的数据库操作功能,对于数据库版本管理和复杂的关系映射等功能,需要开发者自行编写大量的代码来实现,增加了开发的难度和工作量。
性能
- Room:虽然对 SQLite 进行了封装,但在执行 SQL 语句时,底层仍然是通过 SQLite 来实现的,因此在性能上不会有太大的损耗。同时,Room 还会对一些常见的操作进行优化,例如在批量插入数据时,会采用合适的方式来提高插入效率。不过,由于 Room 需要进行一些额外的处理(如注解处理、对象映射等),在某些极端情况下,可能会有轻微的性能开销。
- SQLite:由于直接操作数据库,没有中间层的额外处理,在一些对性能要求极高、对代码执行效率非常敏感的场景下,直接使用 SQLite 可能会具有一定的性能优势,可以根据具体需求进行更精细的性能优化。
安全性
- Room:在一定程度上增强了数据库操作的安全性。例如,在执行 SQL 语句时,Room 会对输入参数进行检查和处理,避免 SQL 注入等安全问题。通过使用类型安全的方法和参数绑定,减少了因错误的 SQL 语句导致的数据泄露或损坏的风险。
- SQLite:直接使用 SQLite 时,如果开发者在编写 SQL 语句时不注意对输入参数的处理,很容易出现 SQL 注入漏洞,攻击者可以通过构造恶意的 SQL 语句来获取敏感数据或破坏数据库,安全性相对较低,需要开发者具备较强的安全意识和编写安全代码的能力。
五、总结
Room 框架为 Android 开发者提供了一种更加优雅、高效的数据库操作方式。通过使用注解和分层设计,它简化了数据库操作的代码编写,提高了代码的可读性和可维护性。
相关文章:
Android学习总结之Room篇
一、Room 框架基础 1. 实体类(Entity) 实体类用于描述数据库表的结构。通过使用 Entity 注解,可以将一个 Java 类映射到数据库中的一张表。例如,以下是一个简单的 User 实体类: import androidx.room.Entity; impor…...
java IO流
一:概述 (1)IO (2)流 二:分类 (1)流向 (2)数据单位 (3)IO流角色 三:API (1)InputStream ÿ…...
STM32 串口USART
目录 常见的通信方式 串行通信和并行通信 全双工,半双工和单工通信 同步通信和异步通信 通信速率 常见的通信协议 串口基础知识 电平特性 串口传输协议 STM32F103的USART资源 端口引脚 数据寄存器单元 发送接收控制单元 实现串口发送 printf…...
数字IC后端项目典型问题之后端实战项目问题记录(2025.04.24)
今天给大家分享下近两天小编帮助学员解决的几个经典后端项目问题。希望能够对大家的学习和工作有所帮助。 Q1:在做a7top顶层物理验证Calibre LVS检查时提示NOT COMPARED,请问是什么原因? 我们在用calibre检查LVS后,其结果基本上就是以下三种…...
关于边缘计算盒子的外部接口保护
边缘计算盒子是一种基于边缘计算和人工智能技术的智能设备,它内置了灵活可配的多样化AI算法库,所以也被称为AI算法盒子或智能边缘分析一体机,可以将数据处理和分析的能力推至离数据源最近的边缘位置,提供高效的数据处理和实时响应…...
OCP考试需要注意什么?
一、OCP考试需要准备的资料 身份证件:携带有效的身份证件(如身份证、护照等),以便在考试当天进行身份验证。确保身份证件在考试当天仍然有效,并且与报名时使用的证件一致。 准考证:打印并携带准考证&…...
git Http改用户下载
用原先别人账号,无权下更新 http方式设置自己账号 例如 git fetch --all 提示没有权限从 http://192.168.1.2/gitlab/项目路径.git下载 git remote set-url origin http://your-username192.168.1.2/gitlab/项目路径.git your-username修改成自己的git账号 需要输入一个Tok…...
postgres 导出导入(基于数据库,模式,表)
在 PostgreSQL 中,导出和导入数据库、模式(schema)或表的数据可以使用多种工具和方法。以下是常用的命令和步骤,分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…...
把dll模块注入到游戏进程的方法_挂起进程注入
一. 概述 挂起进程注入是指在创建进程的时候把运行状态设置为挂起,然后创建一个远程线程,来注入。挂起进程注入作为远线程注入的一个补充,可以在进程创建的时候就注入,从而注入时间较早,不宜被拦截。易知挂起进程注入的局限性也就是如果进程已经启动,那么这种注入方式就…...
TypeScript 开发实战:如何安全替换字符串中的关键字
在 TypeScript 开发中,我们经常需要处理字符串替换的场景。最近我在开发一个表达式解析功能时,遇到了一个有趣的挑战:如何将用户输入的简化数学表达式(如"sin")替换为标准形式(如"Math.sin&…...
ES6 模块化 与 CommonJS 的核心概念解析
以下是关于 ES6 模块化 与 CommonJS 的核心概念解析、知识点总结及使用场景说明: 1. ES6 模块化与 CommonJS 是什么? ES6 模块化(ECMAScript Modules, ESM) 定义:ES6 标准引入的模块系统,使用 import 和 …...
【踩坑记录】stm32 jlink程序烧录不进去
最近通过Jlink给STM32烧写程序时一直报错,但是换一个其他工程就可以烧录,对比了一下jink配置,发现是速率选太高了“SW Device”,将烧录速率调整到10MHz以下就可以了...
CS144 Lab 6 实战记录:构建 IP 路由器
1 实验背景与目标 在 CS144 的 Lab 6 中,我们需要在之前实现的 NetworkInterface(Lab 5)基础上构建一个完整的 IP 路由器。路由器的主要任务是根据路由表将接收到的 IP 数据报转发到正确的网络接口,并发送给正确的下一跳…...
AI与智能能源管理:如何通过AI优化能源分配和消耗?
引言:能源管理面临的新挑战 在“双碳”目标持续推进的背景下,能源管理已经不再是简单的节电节水问题,而是关乎可持续发展和企业长期竞争力的核心议题。无论是工业园区、写字楼,还是家庭用户,能源的使用正在变得越来越复…...
【蓝桥杯】产值调整
产值调整 题目描述 偏远的小镇上,三兄弟共同经营着一家小型矿业公司“兄弟矿业”。公司旗下有三座矿山:金矿、银矿和铜矿,它们的初始产值分别用非负整数 A A A、 B B B 和 C C C 表示。这些矿山的产出是小镇经济的核心,支撑着…...
使用Next.js构建单页面React应用
最近遇到一个问题 突然要一个单页面的项目 用惯了Next.js 而 create-react-app 又不推荐且不灵活 最终找发现Nextjs也支持单页面应用 以下是使用Next.js构建单页面React应用过程 1 正常创建项目 (我选择的是Pages Router 而非 AppRoute) 2 修改配置文件 next.config.ts impor…...
Python字符串三剑客:len()、split()、join()深度解析
目录 一、len():字符串的"测谎仪" 二、split():字符串的"解剖刀" 参数解析: 实战场景: 三、join():字符串的"缝合怪" 性能优势: 实战案例: 高级技巧&…...
大模型是如何生成内容的?
大模型(如 GPT、Claude、LLaMA 等)生成内容的过程,其实就是一个 逐词预测上下文推理 的过程。我们可以把它想象成一个“超级自完成引擎”:每一步都在问自己—— “在目前上下文下,最合理的下一个词是什么?”…...
Python元组全面解析:从基础到高级应用指南
一、元组基础概念与核心特性 1.1 元组的本质定义 元组(Tuple)是Python中重要的不可变序列类型,由多个元素组成的有序集合。其核心特性表现在: 元素按插入顺序存储,支持索引访问所有元素存储在连续内存空间ÿ…...
Docker部署DeepSeek常见问题及解决方案
在使用Docker部署DeepSeek的过程中,许多开发者可能会遇到一些常见问题。本文整理了几个高频问题及其解决方案,帮助大家更顺利地完成部署。 镜像拉取失败 问题现象 执行 docker pull 命令时,提示超时或镜像不存在。 可能原因 1. 网络环境不稳定,导致连接Docker Hub失败…...
身份证实名认证接口数字时代的信任基石-node.js实名认证集成
在互联网深度渗透生活的当下,从线上购物、社交娱乐到金融理财、政务办理,每一次指尖的触碰都在虚拟世界中留下痕迹。身份证实名认证作为连接现实身份与网络身份的桥梁,正以其不可替代的作用,重塑着数字时代的信任体系。它不仅是保…...
多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)
多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究) 目录 多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)效果一览基本介绍程序设计参考资料 效果一览…...
强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)
强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)是人工智能领域两个重要的研究方向,虽然二者可以结合(如深度强化学习),但其核心思想、目标和应用场景存在本质区…...
图论---Prim堆优化(稀疏图)
题目通常会提示数据范围: 若 V ≤ 500,两种方法均可(朴素Prim更稳)。 若 V ≤ 1e5,必须用优先队列Prim vector 存图。 #include <iostream> #include <vector> #include <queue> #include <…...
【优秀三方库研读】【C++基础知识】odygrd/quill -- 折叠表达式
compute_encoded_size_and_cache_string_lengths 方法中这段代码是一个C的折叠表达式(fold expression)的应用,用于计算多个参数编码后的总大小。下面我将详细解释这段代码的每个部分,并说明为什么这样写。 代码如下: …...
优化Nginx的下载功能
缘起: 我购置了一台阿里云ECS,其EIP带宽3m/s,但是在其上的作为下载文件的服务器nginx提供的下载速度仅有几百KB。 分析: 既然没有达到带宽瓶颈,肯定存在优化的空间。浮现脑海的想法,nginx没有进行最佳配置…...
Vue3集成浏览器API实时语音识别
效果示例 用法 <!-- 浏览器语音识别 --> <BrowserSpeechRecognitionModal v-if"showModal" :isOpen"showModal" close"showModal false" confirm"handleRecognitionResult" />const showModal ref(false); const input…...
Python3 基础:函数定义与调用
Python3 基础:函数定义与调用 什么是函数?一、函数的定义二、函数的调用三、函数参数3.1位置参数3.2关键字参数3.3默认参数值3.4可变数量的参数args:接收任意数量的位置参数**kwargs:接收任意数量的关键字参数 3.5 综合使用各种参…...
Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开
以下是 Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开: 1. Vue 2 的响应式 API 核心机制 基于 Object.defineProperty: 通过劫持对象的 getter 和 setter 实现数据变化追踪。限制&…...
修改了Element UI中组件的样式,打包后样式丢失
修改了Element UI中组件的样式,在本地运行没有问题,但是打包到线上发现样式丢失(样式全部不生效、或者有一部分生效,一部分不生效),问题在于css的加载顺序导致代码编译后样式被覆盖了, 解决办法…...
大模型工业化元年:GPT-5开启通用AI新纪元,中国技术如何破局?
过去一周,AI领域的焦点无疑是OpenAI发布的GPT-5预览版,以及全球大模型技术从实验室迈向工业化的关键转折。这场变革不仅标志着通用人工智能(AGI)的进一步逼近,更掀起了全球产业链的竞争与反思。本文将从技术突破、产业…...
离线电脑安装python包
离线电脑安装python第三方库 在联网电脑上下载Python包 使用pip安装所需的包,例如 pip install requests numpy导出已安装的包列表 pip freeze > requirements.txt根据requirements.txt下载包及其所有依赖项到指定目录: pip download -r require…...
【Unity AR开发插件】一、高效热更新:Unity AR 插件结合 HybridCLR 与 ARFoundation 的开源仓库分享
摘要 本篇博客详细介绍了我基于 HybridCLR 与 AR Foundation 的 Unity AR 开发插件,旨在为开发者提供高效的跨平台热更新方案。文章从背景与动机出发,覆盖一键安装工具、环境配置、热更新数据制作与示例程序运行等核心模块,并展示代码结构与使…...
深入浅出学会函数(下)
5. return语句 在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项。 return 后面可以是一个数值,也可以是一个表达式,如果是表达式先执行表达式,再返回表达式的结果。return 后面也可以…...
架构-软件工程
一、软件过程模型(核心高频考点) 1. 瀑布模型 知识点:严格分阶段(需求→设计→编码→测试→维护),前一阶段输出是后一阶段输入,阶段间因果紧密,适合需求明确且稳定的项目。缺点&am…...
Redis 及其在系统设计中的作用
什么是Redis Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息代理。它因其快速的性能、灵活性和易用性而得到广泛应用。 Redis 数据存储类型 Redis 允许开发人员以各种数据结构(例如字符串、位图、位域、哈希、列表、集合、有序集合…...
运维打铁:Centos 7 使用yum安装 mysql5.7
文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…...
第二章:MCP服务器分类
Chapter 2: MCP服务器分类 🌟 从上一章到本章 在第一章:Model Context Protocol (MCP)中,我们学习了如何通过MCP让LLM安全访问文件系统。现在,让我们想象一个更复杂的需求:假设你需要让LLM同时处理文件、查询数据库、…...
遨游三防|30200mAh、双露营灯三防平板,见证堆料天花板
在工业4.0与智能化转型的浪潮中,专业设备对性能、防护及场景适应性的要求日益严苛。遨游通讯作为国家级高新技术企业,依托“危、急、特”场景的深耕经验,推出的旗舰级产品AORO-P300三防平板,以30200mAh超大容量电池、双露营灯设计…...
OFDM 信道表示(3)
上节我们令得到频域相关系数与PDP是一对傅里叶变换对。这次我们令即只考虑同一个RE上随时间变化得过程。 为接收信号自相关函数,令即为上式 所以可得Doppler 功率谱和子相关函数一对傅里叶变换对。 上面给出多径DPL信道接受信号表示,其中为t时间多径时延…...
MongoDB副本集搭建与核心机制
一、节点架构解析 1.1 节点角色分工 主节点(Primary) 唯一写入口:处理所有写操作(插入/更新/删除) Oplog生成器:记录操作日志到local.oplog.rs集合 同步中枢:向所有从节点推送oplog变更 典型…...
深度学习-数值稳定性和模型初始化
到目前为止,我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数,有人会认为初始化方案时理所当然的,忽略了如何做出这些选择的细节,甚至有人可能会觉得,初始化方案的选择并不是特别重要,实际…...
详解Linux中的定时任务管理工具crond
在 Linux 容器环境中,/etc/cron.d/ 目录可能不存在,特别是在精简的容器镜像(如 Alpine、BusyBox 或某些定制化的镜像)中。这是因为容器通常追求轻量级,默认不包含完整的 cron 系统(如 cronie 或 vixie-cron…...
【element plus】解决报错error:ResizeObserver loop limit exceeded的问题
当我们在使用element plus框架时,有时会遇到屏幕突然变暗,然后来一句莫名其妙的报错ResizeObserver loop limit exceeded,其实这是因为改变屏幕大小时el-table导致的报错 网上给出了几种解决方案,我试了其中两种可以实现 方案一&…...
GD32E23x flash作为静态存储的读写操作
目录 一、前言 二、GD32E23x flash扇区地址划分 三、GD32E23x 固件库下载 四、GD32E23x falsh擦写操作函数封装 五,引用示例 一、前言 在只有芯片没有外部存储时需要存储一些配置信息,使用flash进行存储是很好的选择了,在GD32E23x中以flash…...
空闲列表:回收和再利用
空闲列表:回收和再利用 手动与自动内存管理 手动管理:程序员需要明确地分配和释放内存。自动管理:例如使用垃圾收集器(GC),它能够自动检测并回收未使用的对象,不需要程序员干预。 对于某些数据结构如B树,…...
功能脑网络较新的方法[和ai讨论的方向和学习资源]
文章目录 前言和回顾代码实现ai 提问大脑连通性分析方法扩展与分类指南一、现有方法的补充与分类1. 补充的其他连通性方法2. 分类框架 二、近年来的新方法(2019年后)1. 相位动力学扩展2. 信息论与复杂度3. 基于图论与网络科学4. 动态系统与因果推断 三、…...
【MongoDB + Spark】 技术问题汇总与解决方案笔记
场景背景 最近练手项目:Spark 结合 MongoDB 构建商品推荐系统的过程中,过程中出现多种环境配置与兼容性问题,主要涉及 MongoDB 连接、版本兼容性、Casbah 驱动使用问题等。汇总调试过程中遇到的常见错误及其解决方案,供参考复用。…...
给git配置SSH(github,gitee)
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 本文基于mac,linux和win可以参考 个人同时配置gitee和github的ss…...
Linux基础使用-笔记
1. 文件和目录操作 查看当前目录:pwd 命令用于显示当前工作目录的完整路径。 pwd切换目录:cd 命令用于切换工作目录。 # 切换到指定目录 cd /home/user/Documents # 切换到上一级目录 cd .. # 切换到用户主目录 cd ~列出目录内容:ls 命令用…...