Database层和ContentProvider层整理

本文详细介绍了Android系统中数据存储的两层结构:持久化数据层和抽象数据层。重点阐述了SQLite数据库的使用及其封装类SQLiteOpenHelper和SQLiteDatabase的作用,并探讨了ContentProvider在数据访问控制、同步适配、搜索支持等方面的功能。文章还提到了SQL语句在实现过程中无法避免的复杂性,并以CalendarProvider和ContactProvider为例展示了ContentProvider的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概略

     Android系统的数据存储有两个层次,从下到上分别是
          持久化数据层:使用SQLite数据库或文件或其他存储方式构成的持久化数据层
          抽象数据层:使用ContentProvider封装出来的抽象数据层


持久化数据层(我们这里主要关注使用SQLite数据库的情况)

     SQLite所谓的创建数据库其实是创建一张表,而MySQL是先创建一个库,库里面可能多张表
     Android系统封装了两个类来帮助使用SQLite
          SQLiteOpenHelper,用于创建/打开/升级数据库
               这是一个抽象类,需要继承来创建一个自定义类,然后生成自定义类的实例
          SQLiteDatabase,这里封装了常用数据库操作,包括intert()/delete()/update()/query()以及直接的SQL语句操作execSQL()
               此类的实例通过SQLiteOpenHelper的对象得到

     用户需要自定义这个持久化数据层,结构如下
          class MyDatabase {
               包含SQLiteOpenHelper和SQLiteDatabase
               定义各种人性化操作界面
          }
          以后生成MyDatabase对象即可使用


抽象数据层ContentProvider

     这个层次在设计上是非常全面的,功能多得出乎我意料,以下仅是草略看到的

     将内部任意数据,包括数据库或文件,封装为对外的统一的数据表
     提供全系统寻址的Uri
     表和行数据的路由识别,也即在Uri上添加后缀来表示某个表或其中某行
     访问权限控制
     提供对本地和远端之间的同步适配器的支持
     对搜索的支持
     操作的原子性
     C/S访问,即C是ContentSolver,S是ContentProvider
          界面是ContentSolver和ContentProvider之间的界面
     提供getType来返回MIME types
     在应用之间拷贝和粘贴复杂数据
     内容变化监听

     很遗憾,由于SQL语句的累赘,无论是持久化数据层还是抽象数据层都没能摆脱SQL复杂语句的阴影,所以完全不懂SQL是不行的

     系统自带的CalendarProvider和ContactProvider应该是ContentProvider的极好示例,不过并非简单,看得头晕


在 Android 中,房间(Room)是一个持久化库,它提供了一种在 SQLite 数据库上进行抽象的方式。它可以帮助你更轻松地管理 SQLite 数据库,同时提供了一些有用的功能,比如类型转换、简单查询、关联查询等。而 ContentProvider 则是一种组件,它可以帮助你在应用程序之间共享数据。 下面是它们的使用方法: 1. Room 的使用: a. 定义实体类:在 Room 中,实体类代表了在数据库中存储的数据表。你需要使用 `@Entity` 注解来标注实体类,并且在其中定义表的列名类型。 b. 定义 DAO:DAO(数据访问对象)是一个接口,它定义了访问数据库的方法。在 DAO 中,你可以定义增删改查等操作,使用 `@DAO` 注解来标注接口。 c. 定义数据库:你需要定义一个继承自 `RoomDatabase` 类的抽象类,使用 `@Database` 注解来标注。在这个类中,你需要定义数据库的版本号、实体类 DAO。 d. 使用 Room:在应用程序中,你可以通过创建 `RoomDatabase` 的实例来使用 Room。你可以使用 `Room.databaseBuilder()` 方法来创建数据库,并且使用 `build()` 方法来构建数据库的实例。然后你就可以使用 DAO 中定义的方法来访问数据库了。 2. ContentProvider 的使用: a. 定义 ContentProvider:你需要继承自 `ContentProvider` 类,并且实现其中的 `query()`、`insert()`、`update()` 等方法。在 ContentProvider 中,你需要定义 URI(统一资源标识符),它代表了数据的位置。使用 `ContentResolver` 类可以访问 ContentProvider。 b. 注册 ContentProvider:在应用程序的 AndroidManifest.xml 文件中,你需要声明你的 ContentProvider。使用 `provider` 标签来声明 ContentProvider,并且使用 `android:authorities` 属性来定义 URI。 c. 使用 ContentProvider:在应用程序中,你可以使用 `ContentResolver` 类来访问 ContentProvider。你需要通过 URI 来访问数据,使用 `query()`、`insert()`、`update()` 等方法来进行数据操作。 总的来说,Room ContentProvider 都是 Android 中的持久化库,它们有各自的使用场景。如果你需要在应用程序之间共享数据,或者需要提供数据给其他应用程序使用,那么使用 ContentProvider 是比较合适的。如果你只是需要管理应用程序内部的数据库,那么 Room 是比较合适的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值