当前位置: 首页 > article >正文

安卓基础(第一集)

SharedPreferences(本地存储简单数据)


在 Android 中,SharedPreferences 用于存储小型数据。

(1)存储数据
// 获取 SharedPreferences 对象
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
// 获取编辑器
SharedPreferences.Editor editor = sharedPreferences.edit();
// 存储数据
editor.putString("username", "AGI_User");
editor.putInt("age", 25);
editor.putBoolean("isLoggedIn", true);
// 提交更改
editor.apply(); // 或 editor.commit();

💡 apply() 是异步提交,commit() 是同步提交。

(2)读取数据
// 获取 SharedPreferences 对象
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
// 读取数据(如果不存在,则返回默认值)
String username = sharedPreferences.getString("username", "defaultUser");
int age = sharedPreferences.getInt("age", 0);
boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);Log.d("SharedPreferences", "Username: " + username + ", Age: " + age + ", Logged In: " + isLoggedIn);
(3)删除数据
// 获取 SharedPreferences 编辑器
SharedPreferences.Editor editor = sharedPreferences.edit();
// 移除某个键
editor.remove("username");
// 清空所有数据
// editor.clear();
// 提交更改
editor.apply();

SharedPreferences 存储在哪里?

/data/data/你的应用包名/shared_prefs/文件名.xml
  • 存储格式
    SharedPreferences 的数据以 XML 文件 的形式存储。可以用 Android Studio 的 Device File Explorer 查看。

你可以在 Device File Explorer(设备文件管理器)查看:

  1. 打开 Android Studio
  2. 运行你的应用
  3. 打开 Device File Explorer(工具栏的 "View" -> "Tool Windows" -> "Device File Explorer")
  4. 进入 /data/data/你的包名/shared_prefs/ 目录
  5. 找到 MyPrefs.xml,右键 "Save As" 下载查看

🔍 你会看到类似 XML 文件:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map><string name="username">AGI_User</string><int name="age" value="25" /><boolean name="isLoggedIn" value="true" />
</map>

Room(数据库存储)


为什么选择 Room?

特性SQLiteRoom
直接使用 SQL 语句需要手写 SQL自动生成 SQL 语句
代码复杂度代码较多,容易出错代码更简洁,类型安全
运行效率需要手动处理数据库连接内部优化,性能更好
兼容性需要手动管理数据迁移提供自动迁移机制

Room 主要由 3 个核心组件 组成:

  • Entity(实体):定义数据库表
  • DAO(数据访问对象):操作数据库的方法
  • Database(数据库类):管理数据库实例

如何使用 Room?

(1)添加 Room 依赖

app/build.gradlemodule-level)中添加:

dependencies {implementation "androidx.room:room-runtime:2.5.0"annotationProcessor "androidx.room:room-compiler:2.5.0"
}

(2)创建数据库表(Entity)

Room 使用 @Entity 注解 来定义表结构:

import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity(tableName = "user_table")
public class User {@PrimaryKey(autoGenerate = true)  // 主键,自动递增public int id;public String name;public int age;// 构造方法public User(String name, int age) {this.name = name;this.age = age;}
}

(3)创建 DAO(数据库操作接口)

@Dao(Data Access Object)是 Room 提供的接口,定义数据库的增删改查方法:

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import java.util.List;@Dao
public interface UserDao {@Insertvoid insert(User user);  // 插入数据@Query("SELECT * FROM user_table")  List<User> getAllUsers();  // 查询所有用户
}

(4)创建数据库(Database 类)

需要继承 RoomDatabase 并指定 DAO:

import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;// 使用 @Database 注解声明数据库类,并指定数据库包含的实体(表)和版本号
@Database(entities = {User.class}, version = 1)
public abstract class UserDatabase extends RoomDatabase {// 声明一个抽象方法,Room 会自动生成 UserDao 的实现public abstract UserDao userDao();  // 定义一个数据库实例,使用 volatile 关键字保证多线程可见性private static volatile UserDatabase INSTANCE;// 获取数据库实例,使用单例模式确保整个应用只创建一个数据库实例public static UserDatabase getInstance(Context context) {if (INSTANCE == null) { // 如果数据库实例为空,则创建synchronized (UserDatabase.class) { // 线程同步,防止多线程并发创建多个实例if (INSTANCE == null) { // 再次检查,防止多个线程同时通过第一个 if 判断// 创建数据库实例,指定数据库文件名 "user_database"INSTANCE = Room.databaseBuilder(context.getApplicationContext(),UserDatabase.class, "user_database").build();}}}return INSTANCE; // 返回数据库实例}
}

(5)在 Activity 中使用数据库

插入数据
UserDatabase db = UserDatabase.getInstance(this);
UserDao userDao = db.userDao();new Thread(() -> {User user = new User("Alice", 22);userDao.insert(user);
}).start();
查询数据
new Thread(() -> {List<User> userList = userDao.getAllUsers();for (User user : userList) {Log.d("RoomDB", "User: " + user.name + ", Age: " + user.age);}
}).start();

Android 6.0+ 动态权限管理


📍 1. 权限的分类

Android 权限分为两类:

普通权限(Normal Permissions)

  • 这些权限不会影响用户隐私,无需 用户确认,直接在 AndroidManifest.xml 中声明即可。
  • 示例: 访问网络、蓝牙等。
  • 例子:

INTERNET(互联网权限)

<uses-permission android:name="android.permission.INTERNET"/>

危险权限(Dangerous Permissions)

  • 涉及用户隐私,如访问相机、定位、存储、通讯录等,需要 动态请求权限
  • 示例: 读写存储、摄像头、麦克风、电话状态等。
  • 例子:

READ_EXTERNAL_STORAGE(读取外部存储权限)

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

相关文章:

安卓基础(第一集)

SharedPreferences&#xff08;本地存储简单数据&#xff09; 在 Android 中&#xff0c;SharedPreferences 用于存储小型数据。 &#xff08;1&#xff09;存储数据 // 获取 SharedPreferences 对象 SharedPreferences sharedPreferences getSharedPreferences("MyPre…...

数据库高安全—数据保护:数据动态脱敏

书接上文数据库高安全—审计追踪&#xff1a;传统审计&统一审计&#xff0c;从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读&#xff0c;本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏&#xff0c;顾名思义就…...

Datawhale 数学建模导论二 2025年2月

第6章 数据处理与拟合模型 本章主要涉及到的知识点有&#xff1a; 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论&#xff0c;如果对这部分内容不熟悉&#xff0c;可以参考相关概率论与数理统计的…...

ArcGIS Enterprise 与 ArcGIS Online 的关系

ArcGIS Enterprise 和 ArcGIS Online 是 Esri 提供的两款核心产品,它们在功能、部署方式和使用场景上存在显著差异,但同时也有一定的联系和互补性。以下是关于这两款产品的详细关系说明: 1. 产品定位与功能 ArcGIS Enterprise 是一款企业级解决方案,支持在组织的基础设施上…...

ASP.NET Core SignalR实践指南

Hub类的生命周期是瞬态的&#xff0c;每次调用集线器的时候都会创建一个新的Hub类实例&#xff0c;因此不要在Hub类中通过属性、成员变量等方式保存状态。如果服务器的压力比较大&#xff0c;建议把ASP.NET Core程序和SignalR服务器端部署到不同服务器上&#xff0c;以免它们互…...

【力扣 - 简单题】88. 合并两个有序数组

题目&#xff1a;88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 解题&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for (int i m; i < n m; i ){nums1[i] nums2[i -…...

【密评】 | 商用密码应用安全性评估从业人员考核题库(23)

在GM/T0048《智能密码钥匙密码检测规范》中,产品的对称算法性能应满足哪个标准中的要求()。 A.GM/T 0016《智能密码钥匙密码应用接口规范》 B.GM/T 0017《智能密码钥匙密码应用接口数据格式规范》 C.GM/T 0027《智能密码钥匙技术规范》 D.GM/T 0028《密码模块安全技术要求》…...

记录 | WPF基础学习MVVM例子讲解1

目录 前言一、NotificationObject与数据属性创建个类&#xff0c;声明NotificationObject 二、DelegateCommand与命令属性三、View与ViewModel的交互&#xff08;难点&#xff09;在ViewModel文件下创建MainWindowViewModel数据和方法绑定资源指定 代码下载四、优势体现代码下载…...

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…...

实验7 路由器之间IPsec VPN配置

实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接&#xff0c;掌握IPsec VPN配置方法&#xff0c;加深对IPsec协议的理解。 2.实验内容 &#xff08;1&#xff09;按照实验拓扑搭建实验环境。 &#xff08;2&#xff09;在路由器R1和R4配置IP…...

Unity中快速制作2D沙雕动画:流程编

Unity中快速制作2D沙雕动画&#xff08;搞笑/无厘头风格&#xff09;&#xff0c;通过以下方案实现低成本、高成效的开发流程&#xff0c;结合夸张的动作、滑稽的物理效果和魔性音效&#xff1a; 1. 角色与素材设计 核心原则&#xff1a;丑萌即正义&#xff0c;越怪越好&#…...

小白零基础如何搭建CNN

1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同&#xff0c;如有1维卷积、2维卷积、 3维卷积与转置卷积&#xff08;可以简单理解为卷积操作的逆操作&#xff09;&#xff0c;但它们的使用方法比较相似&#xff0c;都可以从torch.nn模块中调用&#xff0c;需要调用的…...

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…...

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…...

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…...

《qt open3d网格拉普拉斯平滑》

qt open3d网格拉普拉斯平滑 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionFilterLaplacian_triggered();void MainWindow::on_actionFil...

怎么选择免费的SEO排名工具

随着2025年互联网的迅猛发展&#xff0c;越来越多的企业意识到&#xff0c;拥有一个高排名的网站对于品牌曝光和吸引客户至关重要。尤其是通过SEO&#xff08;搜索引擎优化&#xff09;&#xff0c;可以提高网站在搜索引擎中的排名&#xff0c;进而带来更多的自然流量&#xff…...

缓存技术介绍

缓存技术是一种用于提高数据访问速度的技术&#xff0c;通过在快速存储介质&#xff08;如内存&#xff09;中保存频繁访问的数据&#xff0c;从而减少对较慢存储介质&#xff08;如硬盘&#xff09;的访问次数。缓存可以显著提高系统性能&#xff0c;尤其是在处理大量数据或进…...

SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)

SSH隧道Nginx&#xff1a;内网资源访问的绿色通道 问题背景 模拟生产环境&#xff0c;使用两层Nginx做反向代理&#xff0c;请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现&#xff0c;重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…...

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南&#xff1a;JavaGuide &#xff08;Github 收获148k Star&#xff09;。这是我在大三开始准备秋招面试的时候创建的&#xff0c;目前已经持续维护 6 年多了&#xff0c;累计提交了 5600 commit &#xff0c;共有 550 多位贡献者共同参与…...

【c++】四种类型转换形式

【c】四种类型转换形式 编译时: static_cast&#xff08;静态转换&#xff09; const_cast&#xff08;去常性转换&#xff09; reinterpret_cast&#xff08;重新解释转换&#xff0c;直接转换地址&#xff09; 运行时: dynamic_cast&#xff08;动态转换&#xff0c;运行时类…...

Unity 制作2D动画必要准备:启动篇

制作Unity 2D动画需要准备以下内容&#xff1a; 美术素材准备 选择或绘制符合需求的2D精灵图&#xff08;如像素风格角色、场景元素&#xff09;确保素材包含完整动画序列帧&#xff08;如行走/攻击/跳跃等动作分解&#xff09;注意素材尺寸统一性&#xff0c;建议采用网格化排…...

半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图

半小时在本地部署DeepSeek的Janus Pro&#xff0c;进行图片分析和文生图 下载Janus Pro源代码下载模型文件创建Python虚拟环境安装依赖包Janus Pro测试运行程序图片分析测试文生图测试使用中文提示词使用英文提示词 测试印象&#xff1a; 整体模型体积较小&#xff0c;个人可以…...

急停信号的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是确认设备按钮的急停…...

设置mysql的主从复制模式

mysql设置主从复制模式似乎很容易&#xff0c;关键在于1&#xff09;主库启用二进制日志&#xff0c;2&#xff09;从库将主库设为主库。另外&#xff0c;主从复制&#xff0c;复制些什么&#xff1f;从我现在获得的还很少的经验来看&#xff0c;复制的内容有表&#xff0c;用户…...

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)

三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测&#xff08;Maltab&#xff09; 一、引言 1、研究背景和意义 在现代数据科学领域&#xff0c;时间序列…...

东方财富Android面试题及参考答案

接口和抽象类的区别是什么? 定义与语法 接口:接口是一种抽象类型,它只包含方法签名、常量定义,方法默认是public、abstract的,常量默认是public、static、final的。接口不能包含实例变量和普通方法的实现。抽象类:抽象类是一种不能被实例化的类,它可以包含抽象方法和具体…...

ArcGIS基础知识之ArcMap基础设置——ArcMap选项:常规选项卡设置及作用

作为一名 GIS 从业者,ArcMap 是我们日常工作中不可或缺的工具。对于初学者来说,掌握 ArcMap 的基础设置是迈向 GIS 分析与制图的第一步。今天,就让我们一起深入了解 ArcMap 选项中常规选项卡的各个设置,帮助大家更好地使用这款强大的软件。 在 ArcMap 中,常规选项卡是用户…...

element-ui时间组件同一个月内选择/30天内选择

element-ui时间组件同一个月内选择/30天内选择 同一个月 <el-date-picker v-model"time" type"datetimerange"range-separator"至" start-placeholder"开始时间"value-format"timestamp" :picker-options"pickerO…...

Linux Media 子系统 V4l2

一 创建 V4l2 的 entity 在Linux内核的Media Controller框架中&#xff0c;V4L2设备作为实体&#xff08;entity&#xff09;的注册过程涉及以下步骤&#xff1a; 1. 初始化Media Controller结构 驱动首先创建一个media_device实例&#xff0c;并与V4L2设备&#xff08;如v4…...