SQLiteDatabase 增删改查(CRUD)详细操作
文章目录
- 1. 初始化数据库
- 2. 插入数据 (Create)
- 方法一:使用 ContentValues + insert()
- 方法二:直接执行SQL
- 3. 查询数据 (Read)
- 方法一:使用 query() 方法
- 方法二:使用 rawQuery() 执行原始SQL
- 4. 更新数据 (Update)
- 方法一:使用 ContentValues + update()
- 方法二:直接执行SQL
- 5. 删除数据 (Delete)
- 方法一:使用 delete() 方法
- 方法二:直接执行SQL
- 6. 事务处理
- 7. 关闭数据库
- 8. 最佳实践
- 完整示例
- 动态SQLite帮助类实现
- 使用示例
- 特点

在 Android 中使用 SQLiteDatabase 进行增删改查操作是开发中的核心技能之一。下面我将详细说明如何使用 SQLiteDatabase 进行 CRUD 操作。
1. 初始化数据库
首先需要获取数据库实例:
// 创建或打开数据库
DatabaseHelper dbHelper = new DatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();// 如果只需要读取数据,可以使用
// SQLiteDatabase db = dbHelper.getReadableDatabase();
2. 插入数据 (Create)
方法一:使用 ContentValues + insert()
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
values.put("email", "zhangsan@example.com");// 插入数据,返回新行的ID,如果插入失败返回-1
long newRowId = db.insert("users", // 表名null, // 当values为空时,指定可以为null的列名values // 要插入的数据
);if(newRowId == -1) {// 插入失败处理
} else {// 插入成功,newRowId是新记录的主键值
}
方法二:直接执行SQL
String sql = "INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com')";
db.execSQL(sql);
3. 查询数据 (Read)
方法一:使用 query() 方法
// 查询所有列
Cursor cursor = db.query("users", // 表名null, // 要查询的列名数组,null表示所有列null, // WHERE子句,null表示无null, // WHERE子句的参数null, // GROUP BY子句null, // HAVING子句"age DESC" // ORDER BY子句
);// 带条件的查询
String[] columns = {"name", "age"};
String selection = "age > ?";
String[] selectionArgs = {"20"};
String orderBy = "name ASC";Cursor cursor = db.query("users",columns,selection,selectionArgs,null,null,orderBy
);// 遍历Cursor
while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));// 处理数据...
}// 记得关闭Cursor
cursor.close();
方法二:使用 rawQuery() 执行原始SQL
String sql = "SELECT * FROM users WHERE age > ?";
Cursor cursor = db.rawQuery(sql, new String[]{"20"});// 处理Cursor...
cursor.close();
4. 更新数据 (Update)
方法一:使用 ContentValues + update()
ContentValues values = new ContentValues();
values.put("age", 26);
values.put("email", "new_email@example.com");// 更新条件
String whereClause = "id = ?";
String[] whereArgs = {"1"};// 更新数据,返回受影响的行数
int count = db.update("users", // 表名values, // 新值whereClause, // WHERE子句whereArgs // WHERE子句的参数
);
方法二:直接执行SQL
String sql = "UPDATE users SET age = 26, email = 'new_email@example.com' WHERE id = 1";
db.execSQL(sql);
5. 删除数据 (Delete)
方法一:使用 delete() 方法
// 删除条件
String whereClause = "id = ?";
String[] whereArgs = {"1"};// 删除数据,返回被删除的行数
int count = db.delete("users", // 表名whereClause, // WHERE子句whereArgs // WHERE子句的参数
);
方法二:直接执行SQL
String sql = "DELETE FROM users WHERE id = 1";
db.execSQL(sql);
6. 事务处理
对于批量操作,使用事务可以提高性能并保证数据一致性:
db.beginTransaction();
try {// 执行多个数据库操作for (int i = 0; i < 100; i++) {ContentValues values = new ContentValues();values.put("name", "User " + i);values.put("age", i % 50);db.insert("users", null, values);}// 标记事务为成功db.setTransactionSuccessful();
} catch (Exception e) {// 处理异常
} finally {// 结束事务db.endTransaction();
}
7. 关闭数据库
在不再需要数据库连接时,应该关闭它:
db.close();
dbHelper.close();
8. 最佳实践
- 始终关闭Cursor和数据库连接:避免内存泄漏
- 使用事务处理批量操作:提高性能
- 避免在主线程执行耗时操作:数据库操作应在子线程中进行
- 使用参数化查询:防止SQL注入
- 考虑使用Room:Android官方推荐的SQLite ORM库
完整示例
public class UserDao {private DatabaseHelper dbHelper;public UserDao(Context context) {dbHelper = new DatabaseHelper(context);}// 添加用户public long addUser(User user) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", user.getName());values.put("age", user.getAge());values.put("email", user.getEmail());long id = db.insert("users", null, values);db.close();return id;}// 获取所有用户public List<User> getAllUsers() {List<User> userList = new ArrayList<>();SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("users", null, null, null, null, null, "name ASC");while (cursor.moveToNext()) {User user = new User();user.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id")));user.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));user.setAge(cursor.getInt(cursor.getColumnIndexOrThrow("age")));user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("email")));userList.add(user);}cursor.close();db.close();return userList;}// 更新用户public int updateUser(User user) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", user.getName());values.put("age", user.getAge());values.put("email", user.getEmail());int count = db.update("users",values,"id = ?",new String[]{String.valueOf(user.getId())});db.close();return count;}// 删除用户public int deleteUser(int userId) {SQLiteDatabase db = dbHelper.getWritableDatabase();int count = db.delete("users","id = ?",new String[]{String.valueOf(userId)});db.close();return count;}// 关闭数据库帮助类public void close() {dbHelper.close();}
}
以上就是在 Android 中使用 SQLiteDatabase 进行增删改查的详细操作。随着 Android 的发展,Google 推荐使用 Room 持久化库来替代直接使用 SQLiteDatabase,它提供了更简洁的 API 和编译时 SQL 检查。
动态SQLite帮助类实现
以下是一个改进版的SQLite帮助类,不固定表和列结构,支持动态创建表和执行CRUD操作:
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class DynamicDBHelper extends SQLiteOpenHelper {private static final String TAG = "DynamicDBHelper";private static final String DATABASE_NAME = "dynamic_db";private static final int DATABASE_VERSION = 1;private static DynamicDBHelper instance;private SQLiteDatabase db;// 表结构缓存: key=表名, value=列定义map(列名->类型)private Map<String, Map<String, String>> tableSchemas = new HashMap<>();// 单例模式public static synchronized DynamicDBHelper getInstance(Context context) {if (instance == null) {instance = new DynamicDBHelper(context.getApplicationContext());}return instance;}private DynamicDBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);db = getWritableDatabase();}@Overridepublic void onCreate(SQLiteDatabase db) {// 不在这里创建固定表,通过外部调用createTable方法动态创建}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 可以根据版本号进行表结构迁移// 实际项目中需要更复杂的升级逻辑for (String tableName : tableSchemas.keySet()) {db.execSQL("DROP TABLE IF EXISTS " + tableName);}tableSchemas.clear();}/*** 动态创建表* @param tableName 表名* @param columns 列定义map(列名 -> 数据类型,如 "TEXT", "INTEGER"等)* @param primaryKey 主键列名(可选)*/public void createTable(String tableName, Map<String, String> columns, String primaryKey) {if (tableExists(tableName)) {Log.w(TAG, "Table " + tableName + " already exists");return;}StringBuilder sql = new StringBuilder("CREATE TABLE " + tableName + " (");// 添加列定义for (Map.Entry<String, String> entry : columns.entrySet()) {String columnName = entry.getKey();String columnType = entry.getValue();sql.append(columnName).append(" ").append(columnType).append(", ");}// 添加主键if (primaryKey != null && !primaryKey.isEmpty()) {sql.append("PRIMARY KEY (").append(primaryKey).append(")");} else {// 移除最后的逗号和空格sql.delete(sql.length() - 2, sql.length());}sql.append(")");db.execSQL(sql.toString());tableSchemas.put(tableName, new HashMap<>(columns));Log.d(TAG, "Table created: " + tableName);}/*** 检查表是否存在*/public boolean tableExists(String tableName) {Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name=?",new String[]{tableName});boolean exists = cursor.getCount() > 0;cursor.close();return exists;}/*** 插入数据* @param tableName 表名* @param values 数据键值对* @return 新插入行的ID*/public long insert(String tableName, ContentValues values) {validateTable(tableName);return db.insert(tableName, null, values);}/*** 批量插入数据* @param tableName 表名* @param valuesList 数据键值对列表* @return 成功插入的数量*/public int bulkInsert(String tableName, List<ContentValues> valuesList) {validateTable(tableName);int count = 0;try {db.beginTransaction();for (ContentValues values : valuesList) {if (db.insert(tableName, null, values) != -1) {count++;}}db.setTransactionSuccessful();} finally {db.endTransaction();}return count;}/*** 查询数据* @param tableName 表名* @param columns 要查询的列* @param selection WHERE条件* @param selectionArgs WHERE条件参数* @param orderBy 排序* @return 查询结果的Cursor*/public Cursor query(String tableName, String[] columns, String selection,String[] selectionArgs, String orderBy) {validateTable(tableName);return db.query(tableName, columns, selection, selectionArgs,null, null, orderBy);}/*** 查询所有数据* @param tableName 表名* @return 包含所有行的Cursor*/public Cursor queryAll(String tableName) {return query(tableName, null, null, null, null);}/*** 更新数据* @param tableName 表名* @param values 要更新的值* @param selection WHERE条件* @param selectionArgs WHERE条件参数* @return 受影响的行数*/public int update(String tableName, ContentValues values, String selection,String[] selectionArgs) {validateTable(tableName);return db.update(tableName, values, selection, selectionArgs);}/*** 删除数据* @param tableName 表名* @param selection WHERE条件* @param selectionArgs WHERE条件参数* @return 受影响的行数*/public int delete(String tableName, String selection, String[] selectionArgs) {validateTable(tableName);return db.delete(tableName, selection, selectionArgs);}/*** 删除表中所有数据* @param tableName 表名* @return 受影响的行数*/public int deleteAll(String tableName) {return delete(tableName, null, null);}/*** 删除表* @param tableName 表名*/public void dropTable(String tableName) {if (tableExists(tableName)) {db.execSQL("DROP TABLE " + tableName);tableSchemas.remove(tableName);Log.d(TAG, "Table dropped: " + tableName);}}/*** 添加列* @param tableName 表名* @param columnName 列名* @param columnType 列类型*/public void addColumn(String tableName, String columnName, String columnType) {validateTable(tableName);if (!tableSchemas.get(tableName).containsKey(columnName)) {db.execSQL("ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " " + columnType);tableSchemas.get(tableName).put(columnName, columnType);Log.d(TAG, "Column " + columnName + " added to table " + tableName);} else {Log.w(TAG, "Column " + columnName + " already exists in table " + tableName);}}/*** 执行原始SQL查询* @param sql SQL语句* @param selectionArgs 参数* @return 结果Cursor*/public Cursor rawQuery(String sql, String[] selectionArgs) {return db.rawQuery(sql, selectionArgs);}/*** 执行原始SQL语句* @param sql SQL语句*/public void execSQL(String sql) {db.execSQL(sql);}/*** 关闭数据库连接*/public void closeDB() {if (db != null && db.isOpen()) {db.close();}}/*** 验证表是否存在*/private void validateTable(String tableName) {if (!tableSchemas.containsKey(tableName)) {throw new IllegalArgumentException("Table " + tableName + " does not exist");}}/*** 获取表的列信息* @param tableName 表名* @return 列名到类型的映射*/public Map<String, String> getTableColumns(String tableName) {validateTable(tableName);return new HashMap<>(tableSchemas.get(tableName));}
}
使用示例
// 初始化
DynamicDBHelper dbHelper = DynamicDBHelper.getInstance(context);// 创建表
Map<String, String> columns = new HashMap<>();
columns.put("id", "INTEGER");
columns.put("name", "TEXT");
columns.put("age", "INTEGER");
columns.put("email", "TEXT");
dbHelper.createTable("users", columns, "id");// 插入数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
values.put("email", "zhangsan@example.com");
long id = dbHelper.insert("users", values);// 查询数据
Cursor cursor = dbHelper.query("users", null, "age > ?", new String[]{"20"}, "name ASC");
while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));// 处理数据...
}
cursor.close();// 更新数据
ContentValues updateValues = new ContentValues();
updateValues.put("age", 26);
dbHelper.update("users", updateValues, "name = ?", new String[]{"张三"});// 删除数据
dbHelper.delete("users", "age < ?", new String[]{"18"});// 添加新列
dbHelper.addColumn("users", "address", "TEXT");// 删除表
dbHelper.dropTable("users");
特点
- 动态表结构:不固定表和列,可以在运行时创建任意结构的表
- 完整的CRUD操作:提供插入、查询、更新、删除等完整操作
- 批量操作支持:支持批量插入数据
- 表结构缓存:缓存表结构信息,避免频繁查询系统表
- 类型安全:确保操作的表和列存在
- 事务支持:批量操作使用事务保证数据一致性
- 原始SQL支持:可以直接执行原始SQL语句
这个实现可以根据需要进一步扩展,比如添加索引支持、更复杂的表结构变更等功能。
相关文章:
SQLiteDatabase 增删改查(CRUD)详细操作
文章目录 1. 初始化数据库2. 插入数据 (Create)方法一:使用 ContentValues insert()方法二:直接执行SQL 3. 查询数据 (Read)方法一:使用 query() 方法方法二:使用 rawQuery() 执行原始SQL 4. 更新数据 (Update)方法一:…...
从 0 到 1 打通 AI 工作流:Dify+Zapier 实现工具自动化调用实战
一、引言:当 AI 遇到工具孤岛 在企业数字化转型的浪潮中,AI 工具的应用早已从单一的对话交互进阶到复杂的业务流程自动化。但开发者常常面临这样的困境:本地开发的 MCP 工具(如 ERP 数据清洗脚本、CRM 工单系统 API)如…...
第四届商师校赛 web 1
RceMe ezGame 伪装 Ping Are you from SQNU? Look for the homepage Through 根据题目慢慢试 File_download Post上传得到下载文件 反编译一下 /* * Decompiled with CFR 0.152. * * Could not load the following classes: * javax.servlet.http.HttpServlet */ …...
SSH 互信被破坏能导致 RAC 异常关闭吗
一、 SSH 互信和 RAC 的关系 1、SSH 互信对 RAC 的作用 Oracle 11g R2 在安装 Grid Infrastructure 的时候,能够通过安装程序配置节 点间的 SSH 用户等效性,之所以要在安装之前配置 SSH 用户等效性,是为了能 够在安装前使用 C…...
工程投标k值分析系统(需求和功能说明)
1 需求总括 2 企业管理模块: 新增、删除、修改企业/部门 <...
Qt-托盘的实现
文章目录 托盘的功能QSystemTrayIcon 类QSystemTrayIcon类的常用函数代码实现 托盘的功能 GUI 程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序…...
【人脸识别】百度人脸识别H5方案对接
经调研,百度的人脸识别使用场景比较广泛且准确率较高,项目上有用到,这里做一下记录,整体对接没有难度,按照文档操作就行。 一、准备工作 1、需要注册百度云开放平台(企业资质)注册指南 2、创…...
用Qt和deepseek创建自己的问答系统
如果你不想花钱调用deepseek,试试下面的方法。 1: 访问 OpenRouter: https://openrouter.ai 2: 搜索 DeepSeek-R1 (free) 要使用这个免费模型,你需要: (1)注册 OpenRouter 账户并获取 API 密钥 访问 …...
飞搭系列 | 组件增加标记,提升用户体验
前言 Preface 飞搭低代码平台(FeiDa,以下简称“飞搭”),为企业提供在线化、灵活的业务应用构建工具,支持高低代码融合,助力企业低门槛、高效率和低成本地快速应对市场变化,加速复杂业务场景落地…...
布隆过滤器的应用
布隆过滤器虽然看起来是一个“算法结构”,但在实际 Web 应用场景中用途非常广泛,尤其在 提升性能、节省资源、防御攻击 等方面非常有用。 缓存穿透保护(常见于 Redis) 📌 问题: 用户频繁请求一些数据库中…...
云原生--基础篇-4--CNCF-1-云原生计算基金会(云原生生态发展和目标)
1、CNCF定义与背景 云原生计算基金会(Cloud Native Computing Foundation,CNCF)是由Linux基金会于2015年12月发起成立的非营利组织,旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…...
(16)VTK C++开发示例 --- 转换文件格式
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 此示例演示如何读取文件,然后将其写入不同类型的文件。 在此示例中,我们读取一个 vtp 文件并…...
离线-DataX
基本介绍 DataX 是阿里云 DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台,它是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源…...
深度学习-全连接神经网络-3
七、过拟合与欠拟合 在训练深层神经网络时,由于模型参数较多,在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合,提升模型的泛化能力(对新数据表现良好)和鲁棒性(对异常数据表现良好)。 1. 概念认知 …...
基于javaweb的SSM+Maven教材管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
DCL介绍
一.dcl-介绍 一.案例 1.查询用户 USE mysql; select * from user; 2.权限控制...
mysql日常巡检
1.查看mysql服务是否异常 systemctl status mysql_3306 查看MySQL进程是否存在 ps -ef | grep mysql 2.连接异常检查 (1)查看是否异常连接 show processlist; #或 show full processlist; (2)查看当前失败连接数 show global status like aborted_connects; (3)查看试…...
Cursor这类编程Agent软件的模型架构与工作流程
开发|界面|引擎|交付|副驾——重写全栈法则:AI 原生的倍速造应用流 来自全栈程序员 nine 的探索与实践,持续迭代中。 欢迎评论私信交流。 最近在关注和输出一系列 AIGC 架构。 模型架构与工作流程 大语…...
记录:扩展欧几里得算法
本文遵循 CC BY-NC-ND 4.0 协议,作者: U•ェ•*U \texttt{U•ェ•*U} U•ェ•*U,转载请获得作者授权。 前置知识 裴蜀定理/贝祖定理:若 a , b a,b a,b 是整数,且 gcd ( a , b ) d \gcd(a,b)d gcd(a,b)d…...
学习笔记——《Java面向对象程序设计》-抽象和接口
参考教材: Java面向对象程序设计(第3版)微课视频版 清华大学出版社 抽象方法 抽象方法是使用abstract关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。 抽象方法的定义格式如下: abstract void 方法名称…...
MySQL中根据binlog日志进行恢复
MySQL中根据binlog日志进行恢复 排查 MySQL 的 binlog 日志问题及根据 binlog 日志进行恢复的方法一、引言二、排查 MySQL 的 binlog 日志问题(一)确认 binlog 是否开启(二)查找 binlog 文件位置和文件名模式(三&#…...
数据库sql语句 中 GROUP BY 关键字详解及字段要求
GROUP BY 关键字详解及字段要求 GROUP BY 的核心作用 将查询结果按指定字段分组,常与聚合函数(如 COUNT, SUM, AVG 等)结合使用,对分组后的数据进行统计计算。 GROUP BY 后字段的要求 非聚合字段必须出现在 GROUP BY 子句中&…...
数据集 | 柑橘果目标检测数据集
文章目录 一、数据集概述1.1 数据标注实例1.2 数据集技术规格 二、样本类别详解2.1 树上柑橘样本2.2 树下柑橘样本 三、标注工具四、数据下载地址 一、数据集概述 在农业智能化领域,柑橘果园的自动化监测与管理一直面临着几个关键挑战: 果实定位准确性…...
Arduino示例代码讲解:Project 11 - Crystal Ball 水晶球
Arduino示例代码讲解:Project 11 - Crystal Ball 水晶球 Project 11 - Crystal Ball 水晶球程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数读取倾斜开关状态:检测状态变化:保存状态:运行过程注意事项Project 11 - Crystal Ball 水晶球 /…...
Redis—为何持久化使用子进程
AOF重写以及bgsave的时候为什么采用fork子进程而不是子线程? 进程间内存隔离 独立的内存空间:子进程拥有与主进程独立的内存空间,确保即使在重写过程中发生崩溃或错误,也不会影响主进程的运行和内存状态。 数据安全性ÿ…...
Vue3 + Vite + TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码
Vue3 Vite TS,使用 ExcelJS导出excel文档,生成水印,添加背景水印,dom转图片,插入图片,全部代码 ExcelJS生成文档并导出导出表头其他函数 生成水印设置文档的背景水印dom 转图片插入图片全部代码 ExcelJS 读取&#…...
VulnHub-DarkHole_1靶机渗透教程
VulnHub-DarkHole_1靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载:https://download.vulnhub.com/darkhole/DarkHole.zip 直接使用VMware打开就行 导入成功,打开虚拟机,到此虚拟机部署完成! 注意:…...
Python设计模式:对象池
1. 什么是对象池设计模式? 对象池设计模式是一种创建型设计模式,主要用于管理和复用对象,以提高性能和资源利用率。它通过维护一个对象的集合(池),来避免频繁地创建和销毁对象,从而减少内存分配…...
【上海大学数据库原理实验报告】MySQL数据库的C/S模式部署
实验目的 掌握Linux环境下MySQL数据库的安装、初始化和基本配置。通过配置MySQL的网络通信,熟悉数据库的远程访问机制及其安全性要求。 实验内容 在腾讯云上租借两台服务器,打开3306端口以允许MySQL远程访问。 图 1 租到的服务器可在控制台观察其状态…...
deepseek快速生成简历
目录 一、需求二、模板例子 三、生成简历四、其他说明 一、需求 现在我准备跳槽到一家公司,这家公司已经发布了招聘需求,现在你想跳槽到这家公司,我们可以利用deepseek快速生成符合这家公司的简历内容。 二、模板 我们要进行指令明确的结构…...
什么是机器视觉3D无序堆叠抓取
机器视觉3D无序堆叠抓取是一种结合三维视觉感知、人工智能算法和机器人控制的技术,旨在从杂乱无序堆叠的物体中识别、定位并抓取目标物体。该技术广泛应用于工业自动化(如物流分拣、装配制造)、仓储管理、食品加工等领域,解决了传统二维视觉或固定规则堆叠场景下的抓取难题…...
Shell脚本中的字符串截取和规则变化
文章目录 前言if通配符判断if判断多个条件规则变化字符串的两个示例改变中间段数字改变末尾段数字 总结 前言 科技的发展会带来习惯的改变,特别是对于我们这批敲代码的,之前还积累一些奇巧淫技,想着在必要的时候卖弄一下,自从生成…...
云账号安全事件应急响应指南:应对来自中国IP的异常访问
在当今数字化时代,云服务已成为企业IT基础设施的核心。然而,随之而来的安全挑战也日益突出。本文将详细介绍当发现云账号被来自中国的IP地址异常利用时,应如何快速有效地响应,以确保账户安全并最小化潜在风险。 1. 确认异常活动 首先,我们需要确认是否真的发生了安全事件…...
python番外
#作者:允砸儿 #日期:乙巳青蛇年 三月廿五 在开始数据库的分享之前笔者简单写以下关于python的番外。笔者这块可能写的不是很好csdn上面有很多大佬,笔者仅以自己的思维和想法与大家分享以下。 安装必看 笔者在这里贴一个网址https://www.…...
Jetson Orin NX 16G 配置GO1强化学习运行环境
这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…...
Embedding与向量数据库__0422
thinking:做一个项目 1,业务背景,价值 2,方法,工具 3,实践(现有的代码,改写的代码) cursor编程有个cursor settings ->privacy mode隐私模式,但是只要连上…...
正向代理和反向代理
正向代理和反向代理是两种在不同场景下使用的代理技术,它们有以下区别: 目标和作用 正向代理 目标 :主要是为客户端服务,帮助客户端去访问外部网络资源。例如,企业内部网络中的员工可能需要访问互联网,但直…...
Android JNI开发中头文件引入的常见问题与解决方案,提示:file not found
Android JNI开发中头文件引入的常见问题与解决方案 问题场景(新手易犯错误) 假设你在开发一个JNI项目,想要实现一个线程安全的队列(SafeQueue),于是直接在cpp目录下创建了safe_queue.h文件,并开…...
三网通电玩城平台系统结构与源码工程详解(二):Node.js 服务端核心逻辑实现
本篇文章将聚焦服务端游戏逻辑实现,以 Node.js Socket.io 作为主要通信与逻辑处理框架,展开用户登录验证、房间分配、子游戏调度与事件广播机制的剖析,并附上多个核心代码段。 一、服务端文件结构概览 /server/├── index.js …...
案例:Windows 作为客户端免密验证(公钥验证)
一、实验前提 1.服务器端为 Linux 系统,且能够正常运行相关命令和服务,如 systemctl、ssh 服务等。同时,客户端为 Windows 系统,且具备使用 SSH 客户端工具连接到 Linux 服务器的条件 2.Linux 服务器上已安装并配置好 SSH 服务&…...
leetcode 二分查找
704. Binary Search 代码: class Solution { public:int search(vector<int>& nums, int target) {int n nums.size();int left 0;int right n-1;int res -1;while(left < right){int mid (leftright)/2;if(nums[mid] target){res mid;break;}…...
C++:STL模板
STL模板分为函数模板和类模板。 我想交换两个数字,但是类型不同,例如我想交换整形a,b,和double类型的d1,d2。如果使用C语言来实现,那么需要像下面一样写两个swap函数,但是除了类型不同,其它都一样…...
NumPy入门:从数组基础到数学运算
目录 一、NumPy 数组基础 (一)创建数组 (二)数组索引 (三)数组切片 二、数组操作 (一)形状操作 (二)数组合并与分割 三、基本数学运算 (…...
文档管理 Document Management
以下是关于项目管理中 文档管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述文档管理的理论框架、核心流程及实战应用: 一、文档管理的基本概念 1. 定义 文档管理是对项目全生命周期中产生的各类文档进行规范化管理的过程,包括创建、存储、版…...
TCP三次握手与四次挥手面试回答版本
面试官:说一下TCP三次握手的过程 参考面试回答: 在第一次握手的时候、客户端会随机生成初始化序号、放到TCP报文头部的序号字段中、同时把SYN标志设置为1 这样就表示SYN报文(这里是请求报文)。客户端将报文放入 TCP 报文首部的序…...
Windows7升级Windows10,无法在此驱动器上安装Windows
一、现象描述 台式机工作站,从Windows7升级Windows10,采用MediaCreationTool_22H2制作U盘启动盘,安装系统遇到问题如下: 二、原因分析 是由于硬盘格式不是GPT硬盘,而Windows系统只能安装到GPT硬盘上,所以…...
【阿里云大模型高级工程师ACP习题集】2.2 扩展答疑机器人的知识范围
练习题 【单选题】在RAG应用的建立索引过程中,文本向量化的主要目的是( )。 A. 将文本转换为计算机能理解的数字形式,便于比较相似度 B. 对文本进行分类 C. 去除文本中的噪声数据 D. 提取文本中的关键词 【多选题】以下属于RAG应用中建立索引步骤的有( )。 A. 文档解析 B…...
Mininet--node.py源码解析
算法逻辑详解 1. 核心类结构 代码通过面向对象的方式定义了网络模拟中的各类节点,继承关系如下: Node ├── Host │ └── CPULimitedHost ├── Switch │ ├── UserSwitch │ ├── OVSSwitch │ ├── OVSBridge │ └── IVSS…...
龙虎榜——20250422
指数目前还是震荡为主,等待后续的选择方向 2025年4月22日龙虎榜行业方向分析 一、核心主线方向 化工(新材料产能优化) • 代表标的:红宝丽(环氧丙烷/锂电材料)、亚太实业(农药中间体ÿ…...
掌握 Altium Designer:轻松定制“交换器件”工具栏
在PCB设计过程中,快速交换器件(如电阻、电容、IC等)是提高效率的关键。Altium Designer提供了灵活的工具栏定制功能,让用户可以创建专属的"交换器件"工具栏,将常用操作集中管理,减少菜单切换时间…...