【问题标题】:Android Room database is a singleton.why there is no private constructor?Android Room 数据库是单例的。为什么没有私有构造函数?
【发布时间】:2020-04-25 11:14:08
【问题描述】:

下面是我的 AppDatabase 类。这是单例

    import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;

@Database(entities = {NoteEntity.class}, version =1,exportSchema = false)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {
    private static AppDatabase instance;
//android will automatically generate code for this abstract method. so we dont need to implement this
    public abstract NoteDao noteDao();

    public static synchronized AppDatabase getInstance(Context context){
        if(instance==null){
            instance= Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, "AppDatabase.db").build();
        }
        return instance;

    }
}

上面的代码工作正常。但是当我包含私有构造函数时

private AppDatabase(){}

这个错误显示

错误:AppDatabase() 在 AppDatabase 中具有私有访问权限 公共最终类 AppDatabase_Impl 扩展 AppDatabase {

我的问题是,如果这是单例模式,为什么我不能包含私有构造函数

【问题讨论】:

    标签: android singleton


    【解决方案1】:

    这是因为当你给它一个私有构造函数时,Room 无法实现你的 AppDatabase 类(AppDatabase_Impl)。 AppDatabase_Impl 需要能够调用超级构造函数。

    您可以将构造函数的访问修饰符更改为受保护:

    protected AppDatabase(){}
    

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多