安卓数据库SQLite

目录

  • 一、SQLite数据库
  • 二、SQLiteOpenHelper和SQLiteDatabase
    • 2.1 SQLiteOpenHelper
    • 2.2 SQLiteDatabase
  • 三、常见数据库使用介绍
    • 3.1 创建数据库
    • 3.2 插入数据
    • 3.3 修改数据(升级数据库)
    • 3.4 删除数据
    • 3.5 查询数据
    • 3.6 关闭数据库
    • 3.7 删除数据库


一、SQLite数据库

SQLite是Android内置的一个小型、关系型、属于文本型的数据库,是一种轻量级的嵌入式关系型数据库管理系统,广泛应用于移动应用开发中,包括Android平台。

  • 用途:在Android开发中,SQLite通常用于存储应用程序的结构化数据,例如用户信息、设置、日志等。开发者可以通过SQLite在本地设备上创建、读取、更新和删除数据库中的数据。
  • API支持:Android提供了SQLiteOpenHelper类和SQLiteDatabase类来管理SQLite数据库。SQLiteOpenHelper类用于创建和管理数据库的帮助类,而SQLiteDatabase类用于执行SQL语句和数据库操作。
  • 数据类型:SQLite支持多种数据类型,包括整数、实数、文本、日期/时间等。开发者可以根据需要选择合适的数据类型来存储数据。
  • 性能:由于SQLite是一个轻量级的数据库引擎,因此在移动设备上运行时具有较好的性能。同时,SQLite还支持事务处理和索引等功能,可以提高数据库操作的效率。

二、SQLiteOpenHelper和SQLiteDatabase

2.1 SQLiteOpenHelper

  • 定义:SQLiteOpenHelper是一个辅助类
  • 作用:管理数据库(创建、增、修、删) & 版本的控制。
  • 使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。
    在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。

SQLiteOpenHelper类的数据库操作方法介绍:

方法名作用
onCreate(SQLiteDatabase db)当数据库第一次被创建时调用此方法。在该方法中,可以执行创建数据库表的SQL语句。
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库需要升级时调用此方法。在该方法中,可以执行升级数据库表结构的SQL语句。
onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)当数据库需要降级时调用此方法。在该方法中,可以执行降级数据库表结构的SQL语句。
getWritableDatabase()获取一个可读/写的数据库实例,如果数据库不存在,则会调用onCreate()方法创建数据库。
getReadableDatabase()获取一个可读的数据库实例,如果数据库不存在,则会调用onCreate()方法创建数据库。
close()关闭数据库连接。
onOpen(SQLiteDatabase db)在数据库被打开时调用,可以用来执行一些初始化操作。

2.2 SQLiteDatabase

  • 定义:SQLiteDatabase类是Android中用于管理SQLite数据库的类,它提供了一系列方法来执行SQL语句和数据库操作。
  • 作用:SQLiteDatabase类的主要作用是提供了对SQLite数据库的操作接口,开发者可以通过它执行创建表、插入数据、查询数据、更新数据、删除数据等操作。
  • 使用过程:获取SQLiteDatabase实例:通常通过SQLiteOpenHelper类的getWritableDatabase()或getReadableDatabase()方法获取一个SQLiteDatabase实例。
    执行SQL语句:通过SQLiteDatabase的execSQL()方法可以执行SQL语句,如创建表、插入数据、更新数据、删除数据等。
    执行查询操作:通过SQLiteDatabase的query()、rawQuery()或rawQueryWithFactory()方法可以执行查询操作,获取结果集。
    事务处理:SQLiteDatabase类还提供了beginTransaction()、setTransactionSuccessful()、endTransaction()等方法来实现事务处理,确保操作的原子性和一致性。
    关闭数据库连接:在操作完成后,通过SQLiteDatabase的close()方法关闭数据库连接,释放资源。

SQLiteDatabase类的数据库操作方法介绍:

方法名作用
execSQL(String sql)执行 SQL 语句,如创建表、插入数据、更新数据、删除数据等,不能进行查询操作
beginTransaction()开启事务。
setTransactionSuccessful()标记事务成功。
endTransaction()结束事务。
insert(String table, String nullColumnHack, ContentValues values)插入数据。
update(String table, ContentValues values, String whereClause, String[] whereArgs)更新数据。
delete(String table, String whereClause, String[] whereArgs)删除数据。
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)查询数据。
rawQuery(String sql, String[] selectionArgs)执行一条 SQL 查询语句。
rawQueryWithFactory(SQLiteDatabase.CursorFactory factory, String sql, String[] selectionArgs, String editTable)执行一条 SQL 查询语句,并使用指定的 CursorFactory 创建 Cursor。
beginTransactionNonExclusive()开启非独占事务。
yieldIfContendedSafely()尝试释放锁,如果有其他线程正在访问数据库,则等待一段时间再尝试。
close()关闭数据库连接。

三、常见数据库使用介绍

数据库操作无外乎:“增删查改”
对于“增、删、改(更新)”这类对表内容变换的操作,需先调用getWritableDatabase()获得一个可写数据库对象,在执行的时候调用通用的execSQL(String sql)或或对应的操作API方法:insert()、delete()、update()
对“查”,需要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法
查询数据库不能使用execSQL方法

3.1 创建数据库

涉及的方法有onCreate()、getWritableDatabase()、getReadableDatabase()

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {/*** context:上下文对象,通常是 Activity 或 Application 的实例。* name:数据库的名称。* factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。* version:数据库的版本号。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** context:上下文对象。* name:数据库的名称。* factory:CursorFactory 对象,用于创建 Cursor 实例。* version:数据库的版本号。* errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {super(context, name, factory, version, errorHandler);}/*** context:上下文对象。* name:数据库的名称。* version:数据库的版本号。* openParams:用于配置数据库打开行为的 OpenParams 对象。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {super(context, name, version, openParams);}//第一次创建数据库的时候回调该方法//当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;//作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;@Overridepublic void onCreate(SQLiteDatabase db) {//SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型//创建了一个名为henry的表String sql = "create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";//execSQL用于执行SQL语句 完成数据库的创建db.execSQL(sql);//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

SqliteActivity.java

public class SqliteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 创建DatabaseHelper对象// 只执行这句话是不会创建或打开连接的SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 1);// 调用getReadableDatabase()或getWritableDatabase()才算真正创建或打开数据库SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();//SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase() ;}}

生成数据库文件路径:/data/data/your_package_name/databases/your_database_name.db。
在这里插入图片描述
在这里插入图片描述

3.2 插入数据

在 Android SQLite 数据库中,事务是一种用于管理一系列数据库操作的机制,可以确保这些操作要么全部成功提交,要么全部回滚。在使用事务时,通常会涉及到以下三个方法:

  • beginTransaction():该方法用于开始一个事务。在调用该方法后,所有的数据库操作都将被包含在同一个事务中,直到调用 setTransactionSuccessful() 或 endTransaction()。
  • setTransactionSuccessful():该方法用于标记当前事务执行成功。如果在调用 setTransactionSuccessful() 之后没有调用 endTransaction(),则当前事务中的所有操作将被提交到数据库。
  • endTransaction():该方法用于结束事务。如果在调用 setTransactionSuccessful() 之后调用了 endTransaction(),则事务将被提交到数据库;如果没有调用 setTransactionSuccessful(),则事务将被回滚,即所有操作将被撤销。
    这三个方法通常一起使用,以确保数据库操作的原子性。在一个事务中,如果所有操作都成功执行,可以调用 setTransactionSuccessful() 来标记事务成功;然后在最后调用 endTransaction() 来提交事务。如果在事务执行过程中发生了错误或异常,可以直接调用 endTransaction() 来回滚事务,使所有操作都被撤销。

步骤:创建并打开数据库(可读/写)、插入数据
涉及方法:getWritableDatabase()、insert() ,insert()也可以使用excelSQL()代替

DatabaseHelper 不变,看一下SqliteActivity

public class SqliteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 创建并打开数据库SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 2);SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();// 创建ContentValues对象ContentValues values = new ContentValues();// 向该对象中插入键值对values.put("id", 1);values.put("name", "henry handsome");//其中,key代表列名,value代表该列要插入的值//注:ContentValues内部实现就是HashMap,但是两者还是有差别的//ContenValues Key只能是String类型,Value只能存储基本类型数据,不能存储对象sqliteDatabase.beginTransaction();// 调用insert()方法将数据插入到数据库当中sqliteDatabase.insert("henry", null, values);// 第一个参数:要操作的表名称// 第二个参数:空列的列名:作为第二个参数传递的是空列的列名。如果插入的数据中某些列的值为 null,可以将这些列的列名传递给该参数。 null,表示没有指定空列的列名。// 第三个参数:ContentValues对象sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();db.execSQL("insert into henry (id,name) values (1,'张三')")  也可以sqliteDatabase.close();}}

生成数据库文件查看:
在这里插入图片描述

3.3 修改数据(升级数据库)

更新数据库版本号触发onUpgrade,添加新列sex,然后在Activity中更新数据,涉及的方法有onUpgrade()、getWritableDatabase()、update()等

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {/*** context:上下文对象,通常是 Activity 或 Application 的实例。* name:数据库的名称。* factory:用于创建 Cursor 对象的 CursorFactory,可以为 null。* version:数据库的版本号。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}/*** context:上下文对象。* name:数据库的名称。* factory:CursorFactory 对象,用于创建 Cursor 实例。* version:数据库的版本号。* errorHandler:用于处理数据库错误的 DatabaseErrorHandler 对象,可以为 null。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {super(context, name, factory, version, errorHandler);}/*** context:上下文对象。* name:数据库的名称。* version:数据库的版本号。* openParams:用于配置数据库打开行为的 OpenParams 对象。*/public DatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {super(context, name, version, openParams);}//第一次创建数据库的时候回调该方法//当使用getReadableDatabase()方法获取数据库实例的时候, 如果数据库不存在, 就会调用这个方法;//作用:创建数据库表:将创建数据库表的 execSQL()方法 和 初始化表数据的一些 insert()方法写在里面;@Overridepublic void onCreate(SQLiteDatabase db) {//SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型//创建了一个名为henry的表String sql = "create table henry(id integer primary key autoincrement,name varchar(64),address varchar(64))";//execSQL用于执行SQL语句 完成数据库的创建db.execSQL(sql);//数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开}//作用:更新数据库表结构//调用时机:数据库版本发生变化的时候回调(取决于数据库版本)//创建SQLiteOpenHelper子类对象的时候,必须传入一个version参数//该参数就是当前数据库版本, 只要这个版本高于之前的版本, 就会触发这个onUpgrade()方法@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//参数说明:// db : 数据库//oldVersion : 旧版本数据库//newVersion : 新版本数据库//使用SQL的ALTER语句String sql = "alter table henry add sex varchar(8)";db.execSQL(sql);}}

SqliteActivity.java

public class SqliteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 3);SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();// 创建一个ContentValues对象ContentValues value = new ContentValues();value.put("sex", "man");sqliteDatabase.beginTransaction();// 调用update方法修改数据库sqliteDatabase.update("henry", value, "id=?", new String[] { "1" });// 第一个参数String:表名// 第二个参数ContentValues:ContentValues对象(需要修改的)// 第三个参数String:WHERE表达式,where选择语句, 选择那些行进行数据的更新, 如果该参数为 null, 就会修改所有行;?号是占位符// 第四个参数String[]:where选择语句的参数, 逐个替换 whereClause 中的占位符;sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();sqliteDatabase.close();}}

看一下更新后的数据:
在这里插入图片描述

3.4 删除数据

delete 删除的是整行而不是整列

新增一行数据并删除一下id为1的数据。
步骤:创建并打开数据库(可读/写)、删除数据
涉及到的方法:getWritableDatabase()、delete() ,delete()也可以使用excelSQL()代替
SqliteActivity.java

public class SqliteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 3);ContentValues values = new ContentValues();values.put("id", 2);values.put("name", "henry handsome2");values.put("address", "china");values.put("sex", "man");SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();sqliteDatabase.beginTransaction();sqliteDatabase.insert("henry", null, values);//调用delete方法进行删除操作sqliteDatabase.delete("henry", "id=?", new String[]{"1"});
//        sqliteDatabase.execSQL("DELETE FROM henry WHERE id = 1");
//        第一个参数 "henry" 是要删除数据的表名。
//        第二个参数 "id=?" 是删除数据的条件,其中 "?" 是一个占位符,用于接收条件值。
//        第三个参数 new String[]{"1"} 是传递给条件的值,表示要删除 id 列值为 "1" 的数据。sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();sqliteDatabase.close();}}

看一下删除后的数据库:
在这里插入图片描述

3.5 查询数据

步骤:创建并打开数据库(可读)、查询数据
涉及方法:getReadableDatabase()、query() 或 rawQuery()

  • query() 方法:用于查询数据库中的数据,并返回一个 Cursor 对象,通过 Cursor 对象可以遍历查询结果。query() 方法的参数包括表名、要返回的列名、查询条件、查询条件参数等。
  • rawQuery() 方法:用于执行 SQL 查询语句,并返回一个 Cursor 对象。可以执行复杂的 SQL 查询语句,如联合查询等。
  • queryWithFactory() 方法:与 query() 方法类似,但可以指定一个 CursorFactory 对象,用于创建 Cursor 对象。
  • rawQueryWithFactory() 方法:与 rawQuery() 方法类似,但可以指定一个 CursorFactory 对象,用于创建 Cursor 对象。
//第一种最为简单
//将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数(selectionArgs)
db.rawQuery(String sql, String[] selectionArgs);  db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);  
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  //参数说明
//table:要操作的表明
//columns:查询的列所有名称集
//selection:WHERE之后的条件语句,可以使用占位符
//groupBy:指定分组的列名
//having指定分组条件,配合groupBy使用
//orderBy指定排序的列名
//limit指定分页参数
//distinct可以指定“true”或“false”表示要不要过滤重复值
//所有方法将返回一个Cursor对象,代表数据集的游标//Cursor对象常用方法如下:
c.move(int offset); //以当前位置为参考,移动到指定行  
c.moveToFirst();    //移动到第一行  
c.moveToLast();     //移动到最后一行  
c.moveToPosition(int position); //移动到指定行  
c.moveToPrevious(); //移动到前一行  
c.moveToNext();     //移动到下一行  
c.isFirst();        //是否指向第一条  
c.isLast();     //是否指向最后一条  
c.isBeforeFirst();  //是否指向第一条之前  
c.isAfterLast();    //是否指向最后一条之后  
c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
c.isClosed();       //游标是否已关闭  
c.getCount();       //总数据项数  
c.getPosition();    //返回当前游标所指向的行数  
c.getColumnIndex(String columnName);//返回某列名对应的列索引值  
c.getString(int columnIndex);   //返回当前行指定列的值  

SqliteActivity.java

public class SqliteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite);// 传入版本号为3,大于旧版本(2),所以会调用onUpgrade()升级数据库SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 3);SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();sqliteDatabase.beginTransaction();Cursor cursor = sqliteDatabase.query("henry", new String[]{"id","name","address","sex"}, "id IN (?, ?)", new String[]{"2","3"}, null, null, null);
//        "henry":表示要查询的表名,即要从名为 "henry" 的表中查询数据。
//        new String[]{"id",name","address","sex"}:表示要返回的列名,
//        "id IN (?, ?)":表示查询条件,这里是根据 id 进行查询。
//        new String[]{"2","3"}:表示查询条件的值,即要查询的 id 值为 2和3。
//        null, null, null:分别表示查询结果的排序方式、分组方式和筛选方式,这里都设置为 null,表示不进行排序、分组和筛选。// 将光标移动到下一行,从而判断该结果集是否还有下一条数据//如果有则返回true,没有则返回false
//        while (cursor.moveToNext()) {
//            id = cursor.getString(cursor.getColumnIndex("id"));
//            name = cursor.getString(cursor.getColumnIndex("name"));
//        }ArrayList list=cursor2list(cursor);sqliteDatabase.setTransactionSuccessful();sqliteDatabase.endTransaction();sqliteDatabase.close();Log.d("henry------"," "+list.toString());}//也可将Cursor中的数据转为 ArrayList<Map<String, String>> 类型数据@SuppressLint("Range")private ArrayList<Map<String, String>> cursor2list (Cursor cursor){ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();//遍历Cursorwhile (cursor.moveToNext()) {Map<String, String> map = new HashMap<String, String>();map.put("id", cursor.getString(cursor.getColumnIndex("id")));map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));map.put("sex", cursor.getString(cursor.getColumnIndex("sex")));list.add(map);}return list;}}

私自又添加了行数据:

在这里插入图片描述

在这里插入图片描述

3.6 关闭数据库

当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。

        SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 3);// 调用getReadableDatabase()方法创建或打开一个可以读的数据库//通过返回的SQLiteDatabase对象对数据库进行操作SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();//关闭当前数据库  sqliteDatabase.close();  

3.7 删除数据库

想要删除数据库时,使用如下:

        SQLiteOpenHelper dbHelper = new DatabaseHelper(SqliteActivity.this,"henry", null, 3);SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();deleteDatabase("henry");

诺,数据库文件没有了
在这里插入图片描述
deleteDatabase() 是 Context 类中的一个方法,用于删除应用程序的数据库。该方法的参数详解如下:

  • 参数 String name
    表示要删除的数据库的名称。通常情况下,数据库的名称对应于应用程序的包名,加上数据库文件的扩展名(例如 mydatabase.db)。
    如果数据库文件存储在默认位置(即应用程序的私有目录中),则只需传入数据库文件的名称即可。
    如果数据库文件存储在其他位置,需要传入完整的数据库文件路径。
  • 返回类型 boolean
    表示删除操作是否成功。
    如果成功删除数据库文件,则返回 true;否则返回 false。
    示例用法:
String databaseName = "mydatabase.db";
boolean isDeleted = context.deleteDatabase(databaseName);
if (isDeleted) {Log.d(TAG, "数据库删除成功");
} else {Log.d(TAG, "数据库删除失败");
}

特别注意
其实对于上述所有的数据库操作(除了“查询”),我们都可以使用下列方法代替:

db.executeSQL(String sql);  
db.executeSQL(String sql, Object[] bindArgs);
//sql语句中使用占位符,然后第二个参数是实际的参数集

议都使用SQL语句,因为:
SQL语句较为通用;
使用insert()、delete()、query()方法具备多个参数,使用复杂。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316916.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache中如何配置 ws 接口

Apache中如何配置 wss 接口 在Apache中配置WebSockets的支持&#xff0c;你需要使用mod_proxy_wstunnel模块&#xff0c;该模块是Apache的一个代理模块&#xff0c;它允许你代理WebSocket请求。 以下是配置步骤的简要说明和示例&#xff1a; 确保你的Apache服务器安装了mod_…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统&#xff1a;2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑&#xff1a;4. Windows上安装VScode链接ubuntu系统&#xff0c;进行远程开发&#xff1a; 1. 安装虚…

变电站综合自动化系统:Modbus-PLC-645转IEC104网关方案

前言 电力行业作为关系国计民生的重要基础产业&#xff0c;是关系千家万户的公用事业。但是要做好电力行业安全保障工作的前提&#xff0c;是需要对应的技术人员详细了解电力工业使用的系统、设备以及各类协议的安全特性&#xff0c;本文将主要介绍IEC 104协议的定义和钡铼技术…

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…

使用 scikit-learn 进行机器学习的基本原理-2

介绍 scikit-learn 估计器对象 每个算法都通过“Estimator”对象在 scikit-learn 中公开。 例如&#xff0c;线性回归是&#xff1a;sklearn.linear_model.LinearRegression 估计器参数&#xff1a;估计器的所有参数都可以在实例化时设置&#xff1a; 拟合数据 让我们用 nump…

智能体可靠性的革命性提升,揭秘知识工程领域的参考架构新篇章

引言&#xff1a;知识工程的演变与重要性 知识工程&#xff08;Knowledge Engineering&#xff0c;KE&#xff09;是一个涉及激发、捕获、概念化和形式化知识以用于信息系统的过程。自计算机科学和人工智能&#xff08;AI&#xff09;历史以来&#xff0c;知识工程的工作流程因…

【酱浦菌-爬虫技术细节】解决学术堂爬虫翻页(下一页)问题

首先我们通过css选择器获取页码信息&#xff0c;这里的css选择器&#xff0c;选择的是含有a标签的所有li标签&#xff0c;代码如下&#xff1a; li html_web.css(div.pd_c_xslb_left_fenye ul li>a) for li in li:li_url li.css(a::attr(href)).get()li_num li.css(a::t…

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…

口袋实验室--使用AD2学习频谱参数测试

目录 1. 简介 2. 频谱相关参数 2.1 频谱相关基本概念 2.1.1 采样时间间隔 2.1.2 采样频率 2.1.3 采样点数 2.1.4 采样时间长度 2.1.5 谱线数 2.1.6 奈奎斯特频率 2.1.7 频谱分辨率 2.1.8 最高分析频率 2.1.9 频谱泄露 2.2 窗函数 2.2.1 AD2的窗函数 2.2.2 测试矩…

Python来计算 1,2,3,4 能组成多少个不相同且不重复的三位数?

我们今天的例子是 有 1&#xff0c;2&#xff0c;3&#xff0c;4 四个数字&#xff0c;它们能组成多省个互不相同且无重复的三位数&#xff1f;都分别是多少&#xff1f; 话不多说&#xff0c;我们先上代码 num 0 # 我们写了三个for循环&#xff0c;表示生成的三位数 for i…

【韩国】UE5的MetaHuman确实可以导入Blender进行编辑。

UE5的MetaHuman确实可以导入Blender进行编辑。根据网络上的信息&#xff0c;你可以将MetaHuman模型导出为FBX文件&#xff0c;然后在Blender中进行修改。修改完成后&#xff0c;你可以将其重新导入到Unreal Engine 5中4。请注意&#xff0c;当你在Blender中编辑模型时&#xff…

六天以太坊去中心化租房平台,前端+合约源码

六天以太坊去中心化租房平台 概述项目结构合约部署运行项目功能介绍一、首页二、房东后台我的房屋我的订单上架新房屋 三、租户后台我的房屋我的订单 四、仲裁后台 下载地址 概述 六天区块链房屋租赁系统&#xff0c;采用去中心化的方式实现了房屋的租赁功能。房东可在平台上托…

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现 MobileNetV4 - Universal Models for the Mobile Ecosystem PDF: https://arxiv.org/pdf/2404.10518.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: ht…

视频怎么批量压缩?5个好用的电脑软件和在线网站

视频怎么批量压缩&#xff1f;有时候我们需要批量压缩视频来节省存储空间&#xff0c;便于管理文件和空间&#xff0c;快速的传输发送给他人。有些快捷的视频压缩工具却只支持单个视频导入&#xff0c;非常影响压缩效率&#xff0c;那么今天就向大家从软件和在线网站2个角度介绍…

Python 数据可视化 boxplot

Python 数据可视化 boxplot import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns# 读取 TSV 文件 df pd.read_csv(result.tsv, sep\t)normal_df df[df["sample_name"].str.contains("normal")] tumor_df df…

Transformers 自然语言处理(二)

原文&#xff1a;zh.annas-archive.org/md5/a1e65552fc41f3b5a667f63d9bed854c 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第四章&#xff1a;从头开始预训练 RoBERTa 模型 在本章中&#xff0c;我们将从头开始构建一个 RoBERTa 模型。该模型将使用我们在 BERT 模…

DVWA靶场

DVWA是指Damn Vulnerable Web Application&#xff0c;是一个用于教育和训练网络安全人员的虚拟漏洞应用程序。DVWA模拟了一个包含了多种常见Web安全漏洞的虚拟环境&#xff0c;包括SQL注入、XSS攻击、CSRF攻击等等。通过使用DVWA&#xff0c;安全人员可以学习和实践各种Web安全…

Django-admin单例模式和懒加载

Django-admin单例模式和懒加载 单例模式 class Foo:def __init__(self):self.name "张三"def __new__(cls, *args, **kwargs):empty_object super().__new__(cls)return empty_objectobj1 Foo() obj2 Foo()当我们实例化对象时&#xff0c;就会在内存开一个空间…

呆马科技——智慧应急执法监管平台

在当今社会&#xff0c;安全生产的重要性日益凸显。对于各级政府和企事业单位&#xff0c;当务之急是如何高效地对突发事件进行执法管理。平台应运而生&#xff0c;旨在通过信息化、智能化技术&#xff0c;提升安全管理的效率与准确性。 一、平台特点 整合各类平台的信息资源&…

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南 由北京海特伟业任洪卓发布于2024年4月23日 随着“互联网”被提升为国家战略&#xff0c;传统行业与互联网的深度融合正在如火如荼地展开。在这一大背景下&#xff0c;海特伟业紧跟时代步伐&#xff0c;凭借其深厚…