Android开发----使用 Room 将数据保存到本地数据库
2024-09-03 05:28:28
Room介绍以及不使用SQLite的原因
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。
处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备重新连接到网络后,用户发起的所有内容更改都会同步到服务器。
由于 Room 负责为您处理这些问题,因此我们强烈建议您使用 Room(而不是 SQLite)。不过,如果您想直接使用 SQLite API,请参阅使用 SQLite 保存数据。
Room 包含 3 个主要组件:
数据库
:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。- 使用
@Database
注释的类应满足以下条件:- 是扩展
RoomDatabase
的抽象类。 - 在注释中添加与数据库关联的实体列表。
- 包含具有 0 个参数且返回使用
@Dao
注释的类的抽象方法。
- 是扩展
在运行时,您可以通过调用 Room.databaseBuilder()
或 Room.inMemoryDatabaseBuilder()
获取 Database
的实例。
Entity
:表示数据库中的表。DAO
:包含用于访问数据库的方法。
应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应用使用每个 DAO 从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。 最后,应用使用实体来获取和设置与数据库中的表列相对应的值。
Room 不同组件之间的关系如图所示:
环境配置
如需在应用中使用 Room,请将以下依赖项添加到应用的 build.gradle 文件。
dependencies {
def room_version = "2.4.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - RxJava2 support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
// optional - Paging 3 Integration
implementation "androidx.room:room-paging:2.4.1"
}
创建User类
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
创建UserDao
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
创建AppDatabase
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
创建上述文件后,您可以使用以下代码获取已创建的数据库的实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
数据库测试
创建两个EditText控件用来输入first_name
与last_name
创建两个按钮用来控制数据库中数据输入与输出
将输出结果显示到TextView中
public class DatabaseTestActivity extends AppCompatActivity {
private UserDao userDao;
private AppDatabase db;
private EditText ed_1,ed_2;
private Button btn_1,btn_2;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_database_test);
db = Room.databaseBuilder(this,AppDatabase.class,"test").allowMainThreadQueries().build();
userDao = db.userDao();
ed_1 = findViewById(R.id.ed_1);
ed_2 = findViewById(R.id.ed_2);
btn_1 = findViewById(R.id.ti);
btn_2 = findViewById(R.id.td);
tv = findViewById(R.id.tv);
btn_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String s = ed_1.getText().toString();
String s1 = ed_2.getText().toString();
User user = new User();
user.firstName=s;
user.lastName=s1;
user.uid=1;
userDao.insertAll(user);
}
});
btn_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<User> all = userDao.getAll();
tv.setText(all.toString());
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
db.close();
}
}
效果展示:
最新文章
- superSlider实现美女轮播图
- 深入理解DOM事件类型系列第四篇——剪贴板事件
- Raytracer
- Effective C++ 之 0 导读(Introduction)
- ACM n-1位数
- java中的乱码问题
- Windows Server 2003从入门到精通之Windows Media Server流媒体服务器架建[转]
- JsonCpp的简单使用方法
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
- git log 常用命令
- 介绍“Razor”— ASP.NET的一个新视图引擎
- unity 脚本(自定义组件)的事件触发关系
- SQL中binary 和 varbinary的区别 blob
- mysql忘记帐号密码 解决办法
- 百度分享share.js插件
- 将文件放到Android模拟器的SD卡中的两种解决方法
- 【数学水题】【TOJ4113】【 Determine X】
- 安装Office2016遇到“无法流式传输Office”问题
- Rsync文件同步工具
- spring分页
热门文章
- 【LeetCode】1161. Maximum Level Sum of a Binary Tree 解题报告 (C++)
- 【LeetCode】366. Find Leaves of Binary Tree 解题报告 (C++)
- 【LeetCode】259. 3Sum Smaller 解题报告 (C++)
- 【九度OJ】题目1208:10进制 VS 2进制 解题报告
- 小小明系列故事——游戏的烦恼(hdu 4517)
- 1076 - Get the Containers
- python学习第一天:window安装python开发环境完整篇
- 【操作系统】编程模拟FIFO,LRU,NUR,OPT页面置换算法
- Layui 的内置jquery 版本
- 《MySQL数据操作与查询》- 返校复习课练习题,创建数据库user_system,创建数据表user及user_ext