安卓基础(第一集)

news2025/2/13 14:15:15

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 {
    @Insert
    void 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"/>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

记录 | 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…

小白零基础如何搭建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…

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 多位贡献者共同参与…

半小时在本地部署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;时间序列…

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

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

14,.左下角的值,路径和,由序列确定树

找树左下角的值 迭代法 层序遍历 class Solution { public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> qu;qu.push(root);TreeNode* leftqu.front();while(!qu.empty()){int szqu.size();leftqu.front();for(int i0;i<sz;i){TreeNode* curqu.fron…

【推理llm论文精读】DeepSeek V3技术论文_精工见效果

先附上原始论文和效果对比https://arxiv.org/pdf/2412.19437 摘要 (Abstract) DeepSeek-V3是DeepSeek-AI团队推出的最新力作&#xff0c;一个强大的混合专家&#xff08;Mixture-of-Experts&#xff0c;MoE&#xff09;语言模型。它拥有671B的总参数量&#xff0c;但每个tok…