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

安卓基础(第一集)

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…...

【从零开始入门unity游戏开发之——C#篇56】C#补充知识点——模式匹配

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

【数据可视化-16】珍爱网上海注册者情况分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

c/c++蓝桥杯经典编程题100道(21)背包问题

背包问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 背包问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;0-1背包&#xff08;基础动态规划&#xff0c;难度★&#xff09; 解法2&#xff1a;0-1背包&#xff08;空间优化版&#xff0c;难度★…...

电赛DEEPSEEK

以下是针对竞赛题目的深度优化方案&#xff0c;重点解决频率接近时的滤波难题和相位测量精度问题&#xff1a; 以下是使用NI Multisim 14.3实现本项目的详细解决方案&#xff1a; 一、基础要求实现方案&#xff08;模块化设计&#xff09; 1. 双频信号发生电路 电路结构&…...

VSOMEIP ROUTING应用和CLIENT应用之间交互的消息

#define VSOMEIP_ASSIGN_CLIENT 0x00 // client应用请求分配client_id #define VSOMEIP_ASSIGN_CLIENT_ACK 0x01 // routing应用返回分配的client_id #define VSOMEIP_REGISTER_APPLICATION 0x02 // client应用注册someip应用 #…...

HTML之基本布局div|span

HTML基本布局使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width<device-width>, initial-scale1.0"><title>布局</title> <…...

Linux下学【MySQL】常用函数助你成为数据库大师~(配sql+实操图+案例巩固 通俗易懂版~)

绪论​ 每日激励&#xff1a;“唯有努力&#xff0c;才能进步” 绪论​&#xff1a; 本章是MySQL中常见的函数&#xff0c;利用好函数能很大的帮助我们提高MySQL使用效率&#xff0c;也能很好处理一些情况&#xff0c;如字符串的拼接&#xff0c;字符串的获取&#xff0c;进制…...

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL ???1.设置消息的TTL 2.设置队列的TTL 3.俩者区别? 二.死信队列 定义&#xff1a; 消息成为死信的原因&#xff1a; 1.消息被拒绝&#xff08;basic.reject 或 basic.nack&#xff09; 2.消息过期&#xff08;TTL&#xff09; 3.队列达到最大长度? …...

机器学习赋能的智能光子学器件系统研究与应用

机器学习赋能的智能光子学器件系统研究与应用 时间&#xff1a; 2025年03月29日-03月30日 2025年04月05日-04月06日 机器学习赋能的光子学器件与系统&#xff1a;从创新设计到前沿应用 课程针对光子学方面的从业科研人员及开发者&#xff0c;希望了解和实践在集成光学/空间…...

尚硅谷课程【笔记】——大数据之Linux【三】

课程视频链接&#xff1a;尚硅谷大数据Linux课程 七、定时任务调度 任务调度&#xff1a;指系统在某个时间执行的特定的命令或程序。 1&#xff09;系统工作&#xff1a;有些重要的工作必须周而复始地执行。 2&#xff09;个别用户工作&#xff1a;用户可能希望在某些特定的时…...

Visual Studio踩过的坑

统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定&#xff0c;供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意&#xff1a;只是看&#xff0…...

教程 | MySQL 基本指令指南(附MySQL软件包)

此前已经发布了安装教程安装教程&#xff0c;现在让我们来学习一下MySQL的基本指令。 一、数据库连接与退出 连接本地数据库 mysql -uroot -p # 输入后回车&#xff0c;按提示输入密码&#xff08;密码输入不可见&#xff09;若需隐藏密码显示&#xff0c;可使用&#xff1…...

企业数据集成案例:吉客云销售渠道到MySQL

测试-查询销售渠道信息-dange&#xff1a;吉客云数据集成到MySQL的技术案例分享 在企业的数据管理过程中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本次我们将分享一个具体的技术案例——通过轻易云数据集成平台&#xff0c;将吉客云中的销售渠…...

网络编程 day3

思维导图 以select函数模型为例 思维导图2 对应 epoll模型 应使用的函数 题目 使用epoll函数实现 两个客户端 通过服务器 实现聊天 思路 在原先代码基础上 实现 服务器 发向 客户端 使用客户端在服务器上的 套接字描述符 实现 客户端 接收 服务器…...

Excel 融合 deepseek

效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "Bearer ", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim postD…...

【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)

官方代码https://github.com/dongbeank/CATS Abstract 时间序列预测在多领域极为关键&#xff0c;Transformer 虽推进了该领域发展&#xff0c;但有效性尚存争议&#xff0c;有研究表明简单线性模型有时表现更优。本文聚焦于自注意力机制在时间序列预测中的作用&#xff0c;提…...

游戏手柄Type-c方案,支持一边充电一边传输数据

乐得瑞推出LDR6023SS&#xff0c;专门针对USB-C接口手机手柄方案&#xff0c;支持手机快充&#xff0c;支持任天堂游戏机&#xff0c;PS4等设备~同时支持手机充电跟数据传输 1、概述 LDR6023SS SSOP16 是乐得瑞科技针对 USB Type-C 标准中的 Bridge 设备而开发的双 USB-C DRP …...

2. 4 模块化JDK:JDK模块结构与核心模块

第3章&#xff1a;模块化JDK&#xff1a;JDK模块结构与核心模块 JDK 9 将自身拆分为一系列模块&#xff0c;彻底告别传统的“单一JAR&#xff08;如 rt.jar&#xff09;”模式。本章深入解析 JDK 的模块化架构、核心模块功能及开发者如何高效利用这些模块。 3.1 JDK 模块化设计…...

每日一题——缺失的第一个正整数

缺失的第一个正整数 题目描述进阶&#xff1a;数据范围&#xff1a; 示例示例 1示例 2示例 3 题解思路代码实现代码解释复杂度分析总结 题目描述 给定一个无重复元素的整数数组 nums&#xff0c;请你找出其中没有出现的最小的正整数。 进阶&#xff1a; 时间复杂度&#xff…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...