为什么建议将将房间数据库扩展到抽象的课程



其背后的原因是什么?是为了表现还是强迫?请解释

首先,我们需要了解有关抽象类的一件事,其中允许您跳过实现父级类的某些默认方法

与您实现所有接口方法的Interfaces不同,在抽象类世界中,儿童类可以选择实现儿童类特定的内容,并在不需要的情况下遗漏其他实现。

如果您对父室室数据库文档进行深入研究,您会注意到它是所有房间数据库的基类,并且它具有一些对子类的方法,例如。createOpenHelper()createInvalidationTracker()clearAllTables()

实际上,文档清楚地提到了'roomDatabase提供了对基础数据库实现的直接访问,但是您应该更喜欢使用dao类'

简单地说,您应该将房间类别标记为 Abstract ,以使您的类变得灵活,然后跳过实现RoomDatabase Base类的不必要方法。

这是正确的,因为当您不将类标记为抽象时,您将获得错误,而Android Studio会提示您实现上述基础类方法。

所以在Kotlin中,您将做类似的事情:

@Database(entities = [Note::class], version = 1)
abstract class NoteDatabase :RoomDatabase() {
    
    //Property must be initialized or be abstrac
 abstract val noteDAO:NoteDAO
 
}

在这里, NoteDatabase从roomdatabase继承以使其成为室database对象 - 它不需要父母的默认实现,因此它跳过了这些实现,因为它用抽象标记。

NOTEDATABASE只需要声明一个抽象的noteDao变量即可。因此,NoteDatabase知道DAO接口,并且此变量也用于测试。

因为RoomDatabase已定义方法,因此继承类不能是接口。而且由于您在该抽象类中写下未定义的方法,所以它不能是一个类。

public interface MyDatabase extends RoomDatabase // extend is not allowed for interface
public class MyDatabase extends RoomDatabase {
     public abstract MyDao myDao(); // abstract method is not allowed for non abstract class
}

因为房间提供了通过sqlite上的抽象层,以允许流利的数据库访问,同时利用sqlite的全部功能。

房间是一个ORM,对象关系映射库。换句话说,房间会将我们的数据库对象映射到Java对象。房间提供了SQLite上的抽象层,以允许使用SQLite的全部功能时流利的数据库访问。

当类扩展抽象类时,它需要覆盖其所有抽象方法。但是,在我们的情况下,我们不需要实现 roomDatabase 类的抽象方法。因此,要克服我们需要使我们的房间数据库类摘要。

abstract class ABC{
public abstract void methodA();
public abstract void methodB();
public abstract void methodC();
}
public class OurClass extends ABC{
public void methodA(){
System.out.println("Only methodA implementation");
}
}    

这将给出编译时间错误。

解决方案1:在子类中实现父类的所有抽象方法。

解决方案2 :(我们的情况(使子类摘要。

如果这些语句中的任何一种适用于您的情况:

考虑使用抽象类:
  • 您想在几个密切相关的几个密切相关的地方共享代码课程。
  • 您希望扩展您的抽象课的课程许多常见的方法或字段,或需要公共以外的其他访问修饰符(例如受保护和私人(。
  • 您想声明非静态或非最终字段。这使您能够定义可以访问和修改状态的方法它们所属的对象。

最新更新