当前位置: 首页 > 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 {
    @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.kler.cn/a/541379.html

相关文章:

  • 【AI学习】关于 DeepSeek-R1的几个流程图
  • 深度学习之神经网络框架搭建及模型优化
  • 【C++八股】 前置 ++i vs. 后置 i++ 的区别
  • 2月10日QT
  • windows生成SSL的PFX格式证书
  • Vue3 Ref全家桶详解:从入门到实战
  • 嵌入式音视频开发(一)ffmpeg框架及内核解析
  • hive数仓的分层与建模
  • 食品饮料生产瓶颈?富唯智能协作机器人来 “破壁”
  • 使用 DeepSeek 进行图像描述:多模态 AI 技术实践
  • 【Linux】Linux命令:crontab
  • SpringBoot和Spring主要区别
  • React Vite 项目增加 eslint 和 prettier
  • 【网络法医】基线取证和常见反取证技术
  • 【DeepSeek】Deepseek辅组编程-通过卫星轨道计算终端距离、相对速度和多普勒频移
  • Ajax-介绍
  • 深度学习|表示学习|Layer Normalization 全面总结|24
  • CSS入门学习笔记(二)
  • 客户端渲染和服务端渲染
  • bitcoinjs学习笔记0(预备知识)
  • SpringBoot 接口防抖的一些实现方案
  • Unity Dots理论学习-5.与ECS相关的概念
  • R18 2Rx XR devices
  • React 中的 useMemo 和 useCallback 有什么区别?
  • Gaea: 去中心化人工智能平台的未来
  • 智慧机房解决方案(文末联系,领取整套资料,可做论文)