Android 架构之数据库搭建

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

  1. xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响…
  2. xUtils 最低兼容Android 4.0 (api level 14). (Android 2.3?)
  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中进行测试

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值