【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结
文章目录
- 文件存储
- 存储到文件
- 读取文件
- SharedPreferences存储
- 存储
- 获取SharedPreferences对象
- Context 类的 getSharedPreferences() 方法
- Activity 类的 getPreferences() 方法
- PreferenceManager 类中的 getDefaultSharedPreferences() 方法
- 示例
- 读取
- 记住密码的功能
- SQLite数据库存储
- 创建数据库
- 升级数据库
- 添加数据
- 更新数据
- 删除数据
- 查询数据
今天来介绍一下Android的数据持久化技术,提供了三种存储方式,还可以存储到SD卡中。
主要介绍这三种:
文件存储
适用于存储较大或复杂的数据文件,比如图像、视频、文档等。
也适合存储简单的文本文件。
SharedPreferences存储
适用于存储简单的键值对数据,比如用户设置和应用配置。
数据量通常较小,数据结构简单。
数据库存储
适用于存储结构化数据,支持复杂的查询和数据管理。
文件存储
使用Context提供的openFileOutput和openFileInput方法,他们返回
存储到文件
openFileOutput()
public class MainActivity extends AppCompatActivity {private EditText edit; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit = findViewById(R.id.editText); }@Overrideprotected void onDestroy() {super.onDestroy();String inputText = edit.getText().toString(); // 获取EditText中的文本save(inputText); }// 将输入的文本保存到文件的方法private void save(String inputText) {FileOutputStream out = null; // 声明FileOutputStream变量BufferedWriter writer = null; // 声明BufferedWriter变量try {// 打开名为 "data" 的文件out = openFileOutput("data", Context.MODE_PRIVATE);writer = new BufferedWriter(new OutputStreamWriter(out)); // 创建BufferedWriter对象writer.write(inputText); // 将输入的文本写入文件} catch (IOException e) {throw new RuntimeException(e); } finally {try {if (writer != null) {writer.close();}} catch (IOException e) {throw new RuntimeException(e); }}}
}
读取文件
openFileInput
public class MainActivity extends AppCompatActivity {private EditText edit; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); edit = findViewById(R.id.editText);String inputText = load(); // 如果加载到的文本内容不为空if (!TextUtils.isEmpty(inputText)) { // 如果加载到的文本内容不为空edit.setText(inputText); // 将光标移动到文本末尾edit.setSelection(inputText.length()); Toast.makeText(this, "加载成功", Toast.LENGTH_SHORT).show(); }}// 加载之前保存的文本内容private String load() {FileInputStream input = null; BufferedReader reader = null;// 创建 StringBuilder 对象,用于存储加载的文本内容StringBuilder content = new StringBuilder(); try {// 打开名为 "data" 的文件input = openFileInput("data"); // 创建 BufferedReader 对象reader = new BufferedReader(new InputStreamReader(input)); String line;while ((line = reader.readLine()) != null) { content.append(line);}} catch (IOException e) {throw new RuntimeException(e);} finally {try {if (reader != null) {reader.close(); }} catch (IOException e) {throw new RuntimeException(e); }}return content.toString(); }@Overrideprotected void onDestroy() {super.onDestroy();String inputText = edit.getText().toString();save(inputText); }private void save(String inputText) {//省略}
}
SharedPreferences存储
存储
获取SharedPreferences对象
利用SharedPreferences来存储数据,有三种获取SharedPreferences对象的方法
Context 类的 getSharedPreferences() 方法
- 第一个参数指定
SharedPreferences文件名 - 第二个参数指定操作模式,
MODE_PRIVATE:只有当前应用程序可以对SharedPreferences文件读写
SharedPreferences sharedPreferences = getSharedPreferences("data", MODE_PRIVATE);
Activity 类的 getPreferences() 方法
-
只接受一个操作模式
-
自动使用当前应用程序包名作为前缀命名
SharedPreferences文件
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
PreferenceManager 类中的 getDefaultSharedPreferences() 方法
步骤:
- 获取
SharedPreferences.Editor编辑器对象通过
SharedPreferences对象的edit()方法
向
SharedPreferences中存储数据提交数据
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit();
或者
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
示例
public void StoringData(View view) {// 获取 SharedPreferences 编辑器对象SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();// 向 SharedPreferences 中存储数据editor.putString("name", "feng"); // 存储一个字符串值editor.putInt("age", 20); // 存储一个整数值editor.putBoolean("married", false); // 存储一个布尔值// 提交数据editor.apply();
}
-
获取
SharedPreferences编辑器对象:SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();getSharedPreferences("data", MODE_PRIVATE):获取名为data的SharedPreferences文件。MODE_PRIVATE:操作模式,表示只有本应用可以访问此文件。edit():获取SharedPreferences.Editor对象,用于修改SharedPreferences。
-
向
SharedPreferences中存储数据:editor.putString("name", "feng"); editor.putInt("age", 20); editor.putBoolean("married", false);putString("name", "feng"):存储一个字符串键值对。putInt("age", 20):存储一个整数键值对。putBoolean("married", false):存储一个布尔键值对。
-
提交数据:
editor.apply();apply():异步提交数据,不会返回任何结果,更加高效。可以使用commit()同步提交数据,但会返回一个布尔值表示提交是否成功。
读取
get方法:允许你根据键(key)从 SharedPreferences 文件中获取相应的值
getString,getInt,getBoolean,getFloat,getLong,getStringSet
getStringSet(String key, Set<String> defValues)
- 获取一个字符串集合
- 第一个参数:键
- 第二个参数:键不存在,返回的默认值
public void readData(View view) {// 获取 SharedPreferences 对象SharedPreferences sharedPreferences = getSharedPreferences("data", MODE_PRIVATE);// 读取数据String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 0); boolean married = sharedPreferences.getBoolean("married", false); // 打印读取到的数据Log.d("SecondActivity", "name: " + name + " age: " + age + " married: " + married);
}
记住密码的功能
展示登陆界面

记住密码:
public class MainActivity extends BaseActivity {private EditText editText1; // 用于输入账号的 EditTextprivate EditText editText2; // 用于输入密码的 EditTextprivate Button btn; // 用于触发登录的按钮private CheckBox rememberPass; // 用于是否记住密码的复选框private SharedPreferences sharedPreferences; // 用于存储和读取用户的登录信息private SharedPreferences.Editor editor; // 用于编辑 SharedPreferences 的数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); editText1 = findViewById(R.id.editText1);editText2 = findViewById(R.id.editText2);btn = findViewById(R.id.button);rememberPass = findViewById(R.id.remeber_pass);// 获取 SharedPreferences 对象,用于存储和读取数据sharedPreferences = getSharedPreferences("data", MODE_PRIVATE);// 检查 SharedPreferences 中是否保存了记住密码的设置Boolean isRemember = sharedPreferences.getBoolean("remember_password", false);if (isRemember) {// 如果记住密码被勾选,填充账号和密码的 EditText,并且勾选复选框editText1.setText(sharedPreferences.getString("account", ""));editText2.setText(sharedPreferences.getString("password", ""));rememberPass.setChecked(true);}// 登陆按钮点击事件监听器btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取用户输入的账号和密码String count = editText1.getText().toString();String password = editText2.getText().toString();// 验证账号和密码if (count.equals("feng") && password.equals("123")) {// 获取 SharedPreferences 的编辑器对象,注意是在判断语句的外面的大editor = sharedPreferences.edit();// 根据复选框的状态决定是否保存账号和密码if (rememberPass.isChecked()) {// 如果勾选了复选框,保存账号和密码editor.putBoolean("remember_password", true);editor.putString("account", editText1.getText().toString());editor.putString("password", editText2.getText().toString());} else {// 如果未勾选复选框,清除保存的账号和密码editor.clear();}// 应用编辑器的更改editor.apply();// 启动新的 Activity 并结束当前 ActivityIntent intent = new Intent(MainActivity.this, FirstActivity.class);startActivity(intent);finish();} else {// 如果账号或密码错误,显示错误提示Toast.makeText(MainActivity.this, "账号或密码错误", Toast.LENGTH_SHORT).show();}}});}
}
SQLite数据库存储
创建数据库
SQLiteOpenHelper抽象类,需要重写onCreate() onUpgrade()两个方法
自定义一个帮助类继承SQLiteOpenHelper
-
getReadableDatabase()和getWritableDatabase()都可以创建或打开一个现有的数据库(没有就新创建一个)
返回一个可以对新数据库进行读写操作的对象
-
SQLiteOpenHelper构造方法public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext = context;}-
Context:在构造函数中,这个参数用于初始化mContext,以便在数据库创建时(例如在onCreate方法中)显示Toast消息或访问其他资源 -
String:指定你想要创建或打开的数据库文件的名称。数据库文件会保存在应用的默认数据库目录中(通常是/data/data/<package_name>/databases/) -
SQLiteDatabase.CursorFactory:作用: 这是一个
SQLiteDatabase.CursorFactory对象,用于创建Cursor对象。这个工厂对象可以用于自定义Cursor的创建方式,但通常不需要使用它,默认值为null。使用: 你可以传递一个自定义的
CursorFactory对象,以便自定义Cursor的行为。如果不需要自定义,可以传递null,这时SQLite会使用默认的CursorFactory。 -
int version:数据库的版本号。每次对数据库结构进行更改时,都需要增加这个版本号,以便触发
onUpgrade方法。
数据库创建代码示例:
-
public class MyDatabaseHelper extends SQLiteOpenHelper {// SQL语句用于创建Book表public static final String CREATE_BOOK = "create table Book("+ "id integer primary key autoincrement," // id字段,自增主键+ "author text," // author字段,作者名称+ "price real," // price字段,书的价格+ "pages integer," // pages字段,书的页数+ "name text)"; // name字段,书名private Context mContext; // 用于显示Toast消息的Context对象// 构造函数,初始化数据库助手对象public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version); // 调用父类构造函数mContext = context; // 保存Context对象}// 创建数据库时调用,执行SQL语句创建表@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK); // 执行创建Book表的SQL语句db.execSQL(CREATE_CATEGORY); // 执行创建Category表的SQL语句(注意CREATE_CATEGORY未定义)Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show(); // 显示表创建成功的消息}// 升级数据库时调用,处理数据库版本升级@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
public class MainActivity extends AppCompatActivity {private MyDatabaseHelper databaseHelper; // 数据库帮助类的实例private Button btn; // 按钮控件的实例@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = findViewById(R.id.btn1); // 初始化数据库帮助类databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 1);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取可写的数据库实例databaseHelper.getWritableDatabase();}});}
}
升级数据库
因为oncreate方法只执行一次,当我们要更新数据库是无法成功
public class MyDatabaseHelper extends SQLiteOpenHelper {// 定义创建 Book 表的 SQL 语句public static final String CREATE_BOOK = "create table Book("+ "id integer primary key autoincrement," // 自增主键 id+ "author text," // 作者+ "price real," // 价格+ "pages integer," // 页数+ "name text)"; // 书名// 定义创建 Category 表的 SQL 语句public static final String CREATE_CATEGORY = "create table Category("+ "id integer primary key autoincrement," // 自增主键 id+ "category_name text," // 类别名称+ "category_code integer)"; // 类别代码private Context mContext; // 上下文对象// 构造函数,初始化数据库帮助类public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext = context; // 初始化上下文}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建 Book 表db.execSQL(CREATE_BOOK);// 创建 Category 表db.execSQL(CREATE_CATEGORY);// 显示提示信息Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 如果表存在,删除 Book 表db.execSQL("drop table if exists Book");// 如果表存在,删除 Category 表db.execSQL("drop table if exists Category");// 重新创建数据库onCreate(db);}
}
更新版本号,比刚才大,onUpgrade()就可以执行了
databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 2);
添加数据
CRUD:创建(Create)、读取(Read)、更新(Update)和删除(Delete)
getReadableDatabase()和getWritableDatabase()返回一个可以对新数据库进行读写操作的对象
调用该对象insert方法
insert:
long insert (String table, String nullColumnHack, ContentValues values)
-
table:要插入数据的表名,例如
"Book"。 -
nullColumnHack:
未指定添加数据情况下给某些可为空的列自动赋值
NULL,一般不使用该功能,直接传入null -
values: 一个
ContentValues对象,包含列名和相应的值。使用它的
put方法添加数据ContentValues values = new ContentValues(); values.put("name", "The Da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", 454); values.put("price", 16.96);添加数据示例:
btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取可写的数据库实例SQLiteDatabase db = databaseHelper.getWritableDatabase();// 创建 ContentValues 实例并存储第一条记录的数据ContentValues values = new ContentValues();values.put("name", "The Da Vinci Code"); // 书名values.put("author", "Dan Brown"); // 作者values.put("pages", 454); // 页数values.put("price", 16.96); // 价格// 插入第一条记录到数据库的 "data" 表db.insert("Book", null, values);// 清空 ContentValues 实例并存储第二条记录的数据values.clear();values.put("name", "The Lost Symbol"); // 书名values.put("author", "Dan Brown"); // 作者values.put("pages", 510); // 页数values.put("price", 19.95); // 价格// 插入第二条记录到数据库的 "data" 表db.insert("Book", null, values);// 清空 ContentValues 实例以备将来使用values.clear();}
});
更新数据
与插入数据类似,最后使用update方法更新
- 第一个参数:表名 “Book”
- 第二个参数:ContentValues 对象,包含要更新的列及其新值
- 第三个参数:WHERE 子句,指定哪些行需要更新,这里使用占位符 ‘?’
- 第四个参数:占位符的实际值,这里是 “The Da Vinci Code”
btn3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取可写的数据库实例SQLiteDatabase db = databaseHelper.getWritableDatabase();// 创建 ContentValues 实例并存储要更新的列及其新值ContentValues values = new ContentValues();values.put("price", 150); // 更新书籍的价格为 150// 执行更新操作db.update("Book", values, "name = ?", new String[]{"The Da Vinci Code"});}
});
删除数据
delete方法
- 第一个参数:表名 “Book”
- 第二个参数:WHERE 子句,指定哪些行需要删除,这里使用占位符 ‘?’
- 第三个参数:占位符的实际值,这里是 “500”
btn4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取可写的数据库实例SQLiteDatabase db = databaseHelper.getWritableDatabase();// 执行删除操作// 删除五百页以上的书db.delete("Book", "pages > ?", new String[]{"500"});}
});
查询数据
-
Cursor cursor = db.query("Book", null, null, null, null, null, null);- 第一个参数
"Book"是要查询的表名。 - 第二个参数
null表示查询所有列。 - 第三个到第六个参数
null分别表示WHERE子句、WHERE子句参数、GROUP BY子句和HAVING子句,这里都没有使用。 - 第七个参数
null表示排序顺序,这里没有指定。
- 第一个参数

-
处理查询结果:
if (cursor.moveToFirst())检查游标是否包含数据,如果包含数据,则移动到第一行。-
do {...} while (cursor.moveToNext());循环遍历游标中的所有行,读取每一行的数据,在这里使用
Log.d方法将读取到的数据输出到日志中,方便调试和查看。
-
btn5.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 获取可写的数据库实例SQLiteDatabase db = databaseHelper.getWritableDatabase();// 查询 "Book" 表中的所有数据Cursor cursor = db.query("Book", null, null, null, null, null, null);// 检查游标是否至少包含一行数据if (cursor.moveToFirst()) {do {// 读取当前行的数据String name = cursor.getString(cursor.getColumnIndex("name")); // 读取 "name" 列的数据String author = cursor.getString(cursor.getColumnIndex("author")); // 读取 "author" 列的数据int pages = cursor.getInt(cursor.getColumnIndex("pages")); // 读取 "pages" 列的数据double price = cursor.getDouble(cursor.getColumnIndex("price")); // 读取 "price" 列的数据// 打印读取的数据到日志Log.d("MainActivity", "book name is " + name);Log.d("MainActivity", "book author is " + author);Log.d("MainActivity", "book pages is " + pages);Log.d("MainActivity", "book price is " + price);} while (cursor.moveToNext()); // 移动到下一行数据}// 关闭游标cursor.close();}
});
感谢您的阅读
如有错误烦请指正
参考:
- 《第一行代码》
相关文章:
【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结
文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…...
抖音矩阵管理系统功能说明:一站式掌握
在当下这个信息爆炸的时代,抖音作为短视频领域的佼佼者,其用户规模持续扩大,影响力日益增强。对于内容创作者和营销人员来说,如何高效管理抖音账号,实现内容的多平台分发和精准触达,成为了亟待解决的问题。…...
旅游卡使用指南及常见疑问解答
近期,许多朋友对旅游卡的免费旅游政策表示浓厚兴趣,但心中不免存疑:这真的是全程免费,无需自费一分吗? 在此,我们明确告知:免费旅游确实存在,但享受范围与条件需清晰界定。 本文将…...
【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
背单词工具(C++)
功能分析 生词本管理: 创建生词本文件:在构造函数中创建了“生词本.txt”“背词历史.log”“历史记录.txt”三个文件。添加单词:用户可以输入单词、词性和解释,将其添加到生词本中。查询所有单词:展示生词本中所有的单…...
面试八股 | 数据库引擎 | InnoDB和myISAM的区别?
⭐️⭐️⭐️InnoDB和MyISAM的区别? InnoDB : 1、使用的是行锁,操作时候只锁一行数据,不会对其他有影响,适合高并发工作 2、支持事务 3、不仅缓存索引还要缓存真实数据,适合高并发 4、默认安装 5、支持外键 6、…...
GEE计算五种植被指数(NDVI、EVI2、RVI、MTVI2、OSAVI)
目录 计算公式源代码计算公式 源代码 // 定义感兴趣区域(这里以一个简单的矩形区域为例) var region = ee.FeatureCollection("projects/a-flyllf0313/assets/dachang"); // 定义时间范围 var startDate = 2023-04-18; var endDate &...
C/S架构和B/C架构
C/S架构(Client/Server Architecture)和B/C架构(Browser/Client Architecture)是两种不同 的软件架构模型,它们各自有不同的特点和应用场景。 一、C/S架构(Client/Server Architecture) 1. 定…...
音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版
Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧,重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧…...
浅聊Web Storage(localStorage 和 sessionStorage)、cookie的使用场合
Web Storage(localStorage 和 sessionStorage)、cookie 一、Cookie二、Web StoragelocalStoragesessionStorage与 Cookies 的比较 一、Cookie Cookies 主要用于以下几种情况: 会话管理(Session Management): 登录、购…...
C语言输入输出缓冲机制
文章目录 输入输出缓冲机制概述为什么要有缓冲区缓冲区的类型引发缓冲区的刷新 原理实现 输入输出缓冲机制 概述 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数…...
javaEE-03-cookie与session
文章目录 Cookie创建Cookie获取Cookie更新CookieCookie 生命控制Cookie 有效路径 Session 会话创建和获取sessionSession 域数据的存取Session 生命周期控制浏览器和 Session 之间关联 Cookie Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,…...
EtherNet/IP转Profinet协议网关(经典配置案例)
怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题,作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题,名为JM-PN-EIP,下面是详细介绍。 一,设备主要功能 1、捷米特J…...
华为云依赖引入错误
问题:记录一次项目加在华为云依赖错误,如下: 错误信息:Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…...
【Ubuntu】Ubuntu 配置镜像源(ARM)
【Ubuntu】Ubuntu 配置镜像源(ARM) 零、起因 最近在QEMU中安装了个ubuntu-24.04-live-server-arm64,默认是国外的软件源,很慢,故替换到国内。 壹、替换 源地址(清华源) https://mirror.tun…...
速腾聚创激光雷达复现FAST-LIO
目录 1.软件环境 2.测试执行 3.代码学习 3.1.找主节点代码文件 3.2.整体流程结构 3.3.具体函数理解 记录复现FAST-LIO算法的过程和,代码梳理和理解 1.软件环境 Windows 10(64bits) VMware 16 Pro Ubuntu 20.04 ROS Noetic FAST-LIO的简化版、注释版。感谢…...
k8s核心知识总结
写在前面 时间一下子到了7月份尾;整个7月份都乱糟糟的,不管怎么样,日子还是得过啊, 1、7月份核心了解个关于k8s,iceberg等相关技术,了解了相关的基础逻辑,虽然和数开主线有点偏,但是…...
语言模型及数据集
一、定义 1、语言模型的目标是估计序列的联合概率,一个理想的语言模型就能够基于模型本身生成自然文本。 2、对一个文档(词元)序列进行建模, 假设在单词级别对文本数据进行词元化。 3、计数建模 (1)其中…...
linux如何卸载python3.5
卸载: 1、卸载python3.5 sudo apt-get remove python3.5 2、卸载python3.5及其依赖 sudo apt-get remove --auto-remove python3.5 3、清除python3.5 sudo apt-get purge python3.5 或者 sudo apt-get purge --auto-remove python3.5...
【BUG】已解决:TypeError: expected string or bytes-like object
TypeError: expected string or bytes-like object 目录 TypeError: expected string or bytes-like object 【常见模块错误】 【解决方案】 常见原因及解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
