Android开发使用Room(SQLite封装)操作数据库
创始人
2024-04-03 19:47:44
0

一、Room介绍

           Android采用Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区里逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了方便Sqlite的使用,包括数据库的创建,升级,增删改查等。常见的ORM有ORMLite,GreenDAO等。Google也意识到了推出自家ORM的必要性,于是有了Room。
           Room和其它ORM库一样,也是在Sqlite上提供了一层抽象。
在介绍Room的使用之前,我们需要先明白几个概念。
Entity:这是一个Model类,对应于数据库中的一张表。Entity类是Sqlite表结构在Java类的映射。
Dao:(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。
总的来说就是通过注解的方式操作数据库

二、代码实现

1、添加依赖并同步

在工程build.gradle中添加下面几句

    def room_version = "2.2.0-alpha01"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"

在这里插入图片描述

2、新建一个类通过@Database注解生成一个数据库

StudentDatabase.java

package com.example.learning01;import android.content.Context;import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;@Database(entities = {Student.class},version = 1,exportSchema = false)//关联数据库
public abstract class StudentDatabase extends RoomDatabase {//用户只需要操作DAOpublic abstract StudentDao get_student_dao();//单例模式private static StudentDatabase studentDatabase;public static synchronized StudentDatabase getInstance(Context context){if(studentDatabase == null){studentDatabase = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class,"student_database")//.allowMainThreadQueries() //主线程也能操作数据库 只能测试用.build();}return studentDatabase;}
}

3、新建一个类通过@Entity注解生成一个表

Student.java

package com.example.learning01;import androidx.room.Entity;
import androidx.room.PrimaryKey;//一张表
@Entity
public class Student {@PrimaryKey(autoGenerate = true)private int id;private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

4、新建一个类通过@Dao实现增、删、改、查

StudentDao.java

package com.example.learning01;import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;import java.util.List;@Dao
public interface StudentDao {//增@Insertvoid insert_student(Student ... students);//改@Updatevoid update_student(Student ... students);//删@Deletevoid delete_student(Student ... students);//删@Query("DELETE FROM Student")void delete_all_student();//查@Query("SELECT * FROM Student ORDER BY id DESC")List get_all_student();
}

5、新建一个类通过实现数据库操作,通过异步方式

DBEngine.java

package com.example.learning01;import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;import java.util.List;public class DBEngine {private static final String TAG = "DBEngine";private StudentDao studentDao;public DBEngine(Context context) {StudentDatabase studentDatabase = StudentDatabase.getInstance(context);studentDao = studentDatabase.get_student_dao();}//插入public void insert_student(Student ... student) {new InsertAsynTask(studentDao).execute(student);}//更新public void update_student(Student ... student) {new UpdateAsynTask(studentDao).execute(student);}//删除public void delete_student(Student ... student) {new DeleteAsynTask(studentDao).execute(student);}//全部删除public void delete_all_student(Student ... student) {new DeleteAllAsynTask(studentDao).execute();}//全部查询public void quary_all_student(Student ... student) {new QuaryAllAsynTask(studentDao).execute();}//开启异步操作static class InsertAsynTask extends AsyncTask {private StudentDao studentDao;public InsertAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student ... students) {studentDao.insert_student(students);return null;}}static class UpdateAsynTask extends AsyncTask {private StudentDao studentDao;public UpdateAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {this.studentDao.update_student(students);return null;}}static class DeleteAsynTask extends AsyncTask {private StudentDao studentDao;public DeleteAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {this.studentDao.delete_student(students);return null;}}//全部删除static class DeleteAllAsynTask extends AsyncTask {private StudentDao studentDao;public DeleteAllAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {this.studentDao.delete_all_student();return null;}}static class QuaryAllAsynTask extends AsyncTask {private StudentDao studentDao;public QuaryAllAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {List all_student = this.studentDao.get_all_student();//遍历全部查询的结果for (Student student:all_student){Log.i(TAG, "doInBackground: "+student.toString());}return null;}}
}

三、操作数据库

首先定义一个引擎

 private DBEngine dbEngine;

然后实现

dbEngine = new DBEngine(this);

完整代码

public class MainActivity extends AppCompatActivity {private static final String TAG ="MainActivity";private DBEngine dbEngine;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbEngine = new DBEngine(this);}

1、增

    public void insert_db(View view) {Student student1 = new Student("xupeng1",10);Student student2 = new Student("xupeng2",20);Student student3 = new Student("xupeng3",30);Student student4 = new Student("xupeng4",40);dbEngine.insert_student(student1,student2,student3,student4);}

2、删

    public void delete_db(View view) {Student student = new Student(null,0);student.setId(3);dbEngine.delete_student(student);}public void delete_all_db(View view) {dbEngine.delete_all_student();}

3、改

    public void update_db(View view) {Student student = new Student("weipan",500);student.setId(3);dbEngine.update_student(student);}

4、查

    public void find_db(View view) {dbEngine.quary_all_student();}

四、操作数据库源码

package com.example.learning01;
import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends AppCompatActivity {private static final String TAG ="MainActivity";private DBEngine dbEngine;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbEngine = new DBEngine(this);}public void create_db(View view) {}public void find_db(View view) {dbEngine.quary_all_student();}public void insert_db(View view) {Student student1 = new Student("xupeng1",10);Student student2 = new Student("xupeng2",20);Student student3 = new Student("xupeng3",30);Student student4 = new Student("xupeng4",40);dbEngine.insert_student(student1,student2,student3,student4);}public void update_db(View view) {Student student = new Student("weipan",500);student.setId(3);dbEngine.update_student(student);}public void delete_db(View view) {Student student = new Student(null,0);student.setId(3);dbEngine.delete_student(student);}public void delete_all_db(View view) {dbEngine.delete_all_student();}
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...