Android Jetpack架构组件之Room

Room

https://developer.android.google.cn/topic/libraries/architecture/room

Room重要概念:
Entity:实体类,对应的是数据库的一张表结构,使用注解@Entity标记>
Dao:包含访问一系列访问数据库的方法,使用注解@Dao标记。//Data Access Objects
Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需满足以下条件:定义的类必须是一个继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并且返回一个Dao对象。

app从Database得到get DAO,从DAO得到Entity,从Entity得到和设置对象值

在这里插入图片描述

implementation 'androidx.room: room-runtime: 2.2.5'
//注解器:抽象类自动生成实现类
annotationProcessor 'androidx .room:room-compiler:2.2.5'

Entity

	@Entity (tableName - "student")
    public class Student {

        @PrimaryKey (autoGenerate = true)
        @ColumnInfo(name = "id",typeAffinity = ColumnInfo.INTEGER)
        public int id;
        

        @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
        public string name;

        @columnInfo(name = "name",typeAffinity = ColumnInfo.TEXT)
        public int age;
        
        public student (int id,String name, int age){
			this.id = id;
			this.name = name;
            this.age = age;
        }
       
    // Ignore注解 room会自动忽略此构造函数      
	@Ignores
	public student (string name, int age) {
		this.name = name;
		this.age = age;
	}

Dao:增删查改接口类

@Dao
public interface StudentDao {

    @Insert
	void insertStudent (student. .- students) ;

    @Delete
	void deletestudent (student. . . students);

    @Update
	void updateStudent (Student . . . students) ;

    @Query ( "SELECT *FROMstudent")
	List<Student> getAllstudent ();

    @Query ("SELECT * FROM student WHERE id = :id")
    List<Student> getStudentById(int id);
}

Database

@Database (entities = {Student.class}, version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {

    private static final string DATABASE_NAME= "my_db. db"
    private static MyDatabase mInstance;

    public static synchronized MyDatabase getInstance (Context context) {
		if (mInstance == nul1) {
			mInstance = Room. databaseBuilder(context.getApplicationContext(),
			MyDatabase.class,
			DATABASE_NAME').build() ;
		}
		return minstance;
	}
	public abstract StudentDao getStudentDao ();
}

使用

MyDatabase database = MyDatabase.getInstance (this);
studentDao = database.getStudentDao ( ) ;


public void mlnsert (View view){
	student s1 = new Student ( name: "Jack" , age: 20) ;
    Student s2 = new Student( name: "Rose",age: 1 ;new 		
    InsertStudentTask (studentDao).execute (s1);
}

//room不允许在主线程执行数据库操作
class InsertStudentTask extends AsyncTask<Student, Void,void> {
	private studentDao studentDao;
	
    public InsertStudentTask (StudentDao studentDao){
		this . studentDao - studentDao;
	}

    @override
	protected Void doInBackground (Student. . . students) {
		studentDao.insertStudent ( students) ;
        rerurn null;
    }
}

进一步优化

问题:每当数据库数据发生变化时,都需要开启一个工作线程去重新获取数据库中的数据。
解决:当数据发生变化时,通过LiveData通知View层,实现数据自动更新。

Room+ViewModel+LiveData

在这里插入图片描述

//Repository:通过Repository操作数据库
public class studentRepository {
	private StudentDao studentDao;
    
	public StudentRepository (Context context){
		MyDatabase database = MyDatabase.getInstance ( context) ;
        this.studentDao = database.getStudentDao ( ) ;
	}
    
    public void insertStudent (Student. . . students){
		new InsertStudentTask(studentDao) .execute (students);
    }

    class InsertStudentTask extends AsyncTask<Student, Void,Void> {
		private studentDao studentDao;
		public InsertStudentTask(StudentDao studentDao) { 
            this.studentDa
			
            @override
			protected Void doInBackground (Student. . . students) {
				studentDao.insertstudent (students) ;
				return nul1;
			}
        }
}

//ViewModel:ViewModel传递上下文对象需要用AndroidViewModel
//ViewModel保存数据
public class studentViewModel extends AndroidViewModel {
	private studentRepository repository ;
    
	public StudentViewModel ( @NonNull Application application) {
		super(application) ;
		this.repository = new StudentRepository(application) ;
	}
    
	public void insertStudent (Student. . . students) {
		repository.insertStudent(students) ;
    }
}

//Activity只需要和ViewModel交互即可
studentViewModel = new ViewModelProvider ( owner: this, new
ViewModelProvider.AndroidviewModelFactory(getApplication()).get(StudentViewModel.class)
//Livedata自动更新
studentViewModel.getAllStudentsLive () .observe ( owner: thisnew Observer<List<Student>>()
	@override
	public void onChanged (List<Student> students){
		adapter.setstudents ( students ) ;
		adapter.notifyDataSetChanged ( );
	});
 }
                                          

public void mInsert (View view) {
	Student s1 = new student ( name: "Jack", age: 20) ;
    Student s2 = new Student ( name: "Rose", age: 18);
    studentviewModel .insertStudent (s1,s2) ;
}

room版本升级

1.构造Migration
static final Migration MIGRATION_1_2 = new Migration (1,2){
	@override
	public void migrate (@NonNull SupportSQLiteDatabase database){
		database.execSQL ( "ALTERTABLE student ADD COLUMN sex INTEGER NOT NULLDEFAULT 1" );
};

2.添加addMigrations
public static synchronized MyDatabase getInstance (Context context){
	if ( mInstance -= nul1){
		mInstance = Room. databaseBuilder(context.getapplicationContext(),	
                                          MyDatabase.class,
                                          DATABASE_NAME)
	.addMigrations (MIGRATION_1_2,MIGRATION_2_3)
            .build () ;
}
return mlnstance;
}
    
3.修改注解
@Database (entities = {Student.class}, version = 2, exportSchema = false)

使用Migration升级数据库

问题:如果用户设备上数据库版本为1,而当前要安装的App数据库版本为3,怎么办?
Room会先判断当前有没有直接从1到3的升级方案,如果有,就直接执行从1到3的升级方案,如果没有,那么Room会按照顺序先后执行Migration(1,2)、Migration(2,3)以完成升级。

### 回答1: Jetpack是一套基于Android开发语言Kotlin的组件库,目的是帮助Android开发者快速构建健壮的、高效的应用程序。Jetpack架构组件从入门到精通是一本介绍Jetpack组件库的电子书,其内容向读者提供了Jetpack组件库的最基础的知识体系,以及对组件库的更高阶的实践知识和技能分享。 在读者学习这本电子书时,首先会学习到基本的Jetpack概念,并了解到如何使用各种工具来实现底层代码、布局和资源文件的编写。同时,电子书重点讲解了Jetpack组件库中最常用的组件,比如ViewModel、LiveData、Room、WorkManager等,它们各自的功能和用法,让读者熟知Jetpack组件的基本运作原理。读者还会学习如何将这些组件综合使用,以构造真正的应用程序。在内容的后半部分,电子书重点讲解了Jetpack架构层面的设计,以及如何更有效的使用和管理组件库。 总之,Jetpack架构组件从入门到精通这本电子书非常适合想要学习Jetpack组件库的Android初学者和有一定开发经验的开发者,能够帮助他们快速掌握Jetpack组件库,以及提高软件的可扩展性和有效性。 ### 回答2: Jetpack架构组件是一组Android软件组件和库,通过这些组件和库,开发者可以更加轻松地开发应用程序,并提供高质量的用户体验。Jetpack架构组件包括众多不同的组件和库,这些组件和库都具有不同的用途和功能。对于开发者来说,学习Jetpack架构组件是非常重要的。 《jetpack架构组件从入门到精通 pdf》是一份针对Jetpack架构组件的学习资料。它是可以帮助开发者更好地理解和掌握Jetpack架构组件的重要手册。通过这份PDF文档,开发者可以学习到Jetpack架构组件的基本概念、用途和功能,并了解如何将这些组件和库应用到他们的应用程序开发中。 这份PDF文档涵盖了Jetpack架构组件的多个方面,包括ViewModel、LiveData、Data Binding、Room、Navigation、WorkManager等等。每个章节都包含了详细的介绍和具体的用例,从而帮助开发者更好地理解每个组件和库的用途和功能。 无论是初学者还是经验丰富的开发者,都可以从这份PDF文档中获益。它可以帮助初学者更轻松地入门Jetpack架构组件,并提供了有用的工具和技巧。对于经验丰富的开发者来说,这份PDF文档可以帮助他们更深入地了解Jetpack架构组件,并提供了一些高级技术和策略,以优化应用程序性能和用户体验。 总之,Jetpack架构组件从入门到精通的PDF文档是一份非常有价值的资源,它可以帮助开发者更好地理解和掌握Jetpack架构组件,从而更加轻松地开发高质量的Android应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值