安卓基础(第一集)
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(设备文件管理器)查看:
- 打开 Android Studio
- 运行你的应用
- 打开 Device File Explorer(工具栏的 "View" -> "Tool Windows" -> "Device File Explorer")
- 进入
/data/data/你的包名/shared_prefs/
目录 - 找到
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?
特性 | SQLite | Room |
---|---|---|
直接使用 SQL 语句 | 需要手写 SQL | 自动生成 SQL 语句 |
代码复杂度 | 代码较多,容易出错 | 代码更简洁,类型安全 |
运行效率 | 需要手动处理数据库连接 | 内部优化,性能更好 |
兼容性 | 需要手动管理数据迁移 | 提供自动迁移机制 |
Room 主要由 3 个核心组件 组成:
- Entity(实体):定义数据库表
- DAO(数据访问对象):操作数据库的方法
- Database(数据库类):管理数据库实例
如何使用 Room?
(1)添加 Room 依赖
在 app/build.gradle
(module-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"/>