1. 引言
2. 添加 Room 依赖
3. 创建实体类
1. 使用 @Entity 注解标记实体类
2. 使用 @PrimaryKey 注解标记主键字段
4. 创建 DAO 接口
1. 使用 @Dao 注解标记 DAO 接口
2. 定义插入、查询、更新、删除等操作
5. 创建 Room 数据库类
1. 使用 @Database 注解标记 Room 数据库类
2. 实现需要用到的 DAO 接口
6. 使用 Room 数据库
1. 获取数据库实例
2. 获取 DAO 接口实例
3. 使用该接口提供的方法来操作数据表
7. 总结
一.前言
你还在苦恼的写SQL么?你还在为数据库升级而烦恼么?你还在因查询数据而写繁琐不可用的代码么?
在这,这些都将不复存在!在本篇中,将会让你一点一滴从无到有创建一个不再为数据库而烦恼的框架。
在 Android 架构中,数据库搭建通常使用 SQLite 数据库。下面介绍如何在 Android 项目中使用 SQLite 数据库。
二.项目时间紧迫:快速开发框架(迫不得已)
目前网络上也有一些针对Android的快速开发框架,下面介绍3个主要的快速开发框架。针对这些快速开发框架,个人认为可以参考,但并不推荐使用,因为App整体依赖一个个人维护的框架风险实在太大,框架存在一些学习成本,本身也不一定完全符合App的需求,使用后可能存在代码的臃肿,还有就是架构限制。
三.Afinal
GitHub项目地址:Afinal
Afinal是一个Android的IOC,ORM框架,内置了四大模块功能:FinalAcitivity, FinalBitmap, FinalDb, FinalHttp。通过FinalActivity,可以通过注解的方式进行绑定UI和事件。通过FinalBitmap,可以方便的加载Bitmap图片,而无需考虑OOM等问题。通过FinalDB模块,通过一行代码就可以对Android的SQlite数据库进行增删改查。通过FinalHttp模块,可以以Ajax形式请求Http数据。
四.GitHub项目地址:xUtils3.0
- xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响…
- xUtils 最低兼容Android 4.0 (api level 14). (Android 2.3?)
-
xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本:
- HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略.
- 支持标准的Cookie策略, 区分domain, path…
- 事件注解去除不常用的功能, 提高性能.
- 数据库api简化提高性能, 达到和greenDao一致的性能.
- 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转…
1.首先,需要在项目的 build.gradle 文件中添加以下依赖:
```gradle
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
```
其中,`$room_version` 是 Room 库的版本号。
2.接着,在项目中创建一个实体类来表示数据表中的一行数据:
```java
@Entity
public class User {
@PrimaryKey
public int id;
public String name;
public String email;
}
```
使用 `@Entity` 注解标记该类为实体类,使用 `@PrimaryKey` 注解标记该类中哪个字段是主键。
然后,在项目中创建一个 DAO 接口来定义对该实体类进行的操作:
```java
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user WHERE id = :userId")
User getById(int userId);
@Query("SELECT * FROM user")
List<User> getAll();
@Update
void update(User user);
@Delete
void delete(User user);
}
```
使用 `@Dao` 注解标记该类为 DAO 接口,可以在该接口中定义插入、查询、更新、删除等操作。
3.最后,在项目中创建一个 Room 数据库类,实现该数据库中所需要用到的所有 DAO 接口:
```java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
```
使用 `@Database` 注解标记该类为数据库类,传入 `entities` 参数来指定该数据库中用到的实体类,在该类中实现所有需要用到的 DAO 接口。
完成以上几步后,就可以开始使用 Room 数据库了。先获得到数据库的实例:
```java
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
```
4.使用 `databaseBuilder()` 方法来创建一个 Room 数据库实例,提供 `ApplicationContext`、`AppDatabase` 和数据库名称等参数。可以使用这个实例来获取之前实现的 UserDao 接口实例:
```java
UserDao userDao = db.userDao();
```
然后可以使用该接口提供的方法来操作数据表:
```java
User user = new User();
user.id = 1;
user.name = "Tom";
user.email = "tom@gmail.com";
userDao.insert(user);
User dbUser = userDao.getById(1);
Log.d(TAG, dbUser.name); // 输出:"Tom"
List<User> users = userDao.getAll();
for (User u : users) {
Log.d(TAG, u.name);
}
```
以上就是在 Android 架构中如何使用 SQLite 数据库的步骤,可以根据具体需求进行调整。
5、最终使用
MainActivity
public class MainActivity extends AppCompatActivity {
UserDao<User> userDao;
PhotoDao<Photo> photoDao;
private ArrayList<User> listUser = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestPermission(this);
}
public void save(View view) {
User user = new User("hqk", 18);
long size = userDao.insert(user);
Photo photo = new Photo("time", System.currentTimeMillis(), "path");
long photoSize = photoDao.insert(photo);
Toast.makeText(this, "save line : " + size, Toast.LENGTH_LONG).show();
}
public void update(View view) {
User where = new User();
where.setAge(18);
int size = userDao.update(new User("TOM", 99), where);
Toast.makeText(this, "update Size : " + size, Toast.LENGTH_LONG).show();
}
public void delete(View view) {
User where = new User();
where.setAge(18);
int size = userDao.delete(where);
Toast.makeText(this, "delete Size : " + size, Toast.LENGTH_LONG).show();
}
public void queryList(View view) {
listUser.clear();
listUser.addAll(userDao.query(new User()));
Toast.makeText(this, "查询条数为:" + listUser.size(), Toast.LENGTH_LONG).show();
}
public void requestPermission(
Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1);
return;
}
createTable();
}
private void createTable() {
userDao = BaseDaoFactory.getInstance().createBaseDao(UserDao.class, User.class);
photoDao = BaseDaoFactory.getInstance().createBaseDao(PhotoDao.class, Photo.class);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
createTable();
}
}
6.启动项目,在Postman中进行测试