简体   繁体   English

Android 房间数据库是 singleton。为什么没有私有构造函数?

[英]Android Room database is a singleton.why there is no private constructor?

Below is my AppDatabase class.下面是我的 AppDatabase class。 which is singleton这是 singleton

    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;

    }
}

Above code work fine.上面的代码工作正常。 but when i include private constructor但是当我包含私有构造函数时

private AppDatabase(){}

this error shows这个错误显示

error: AppDatabase() has private access in AppDatabase public final class AppDatabase_Impl extends AppDatabase {错误:AppDatabase() 在 AppDatabase public final class AppDatabase_Impl extends AppDatabase {

My question is if this is singleton pattern why i cant include private constructor我的问题是这是否是 singleton 模式为什么我不能包含私有构造函数

It's because Room cannot implement your AppDatabase class (AppDatabase_Impl) when you give it a private constructor.这是因为当您给它一个私有构造函数时,Room 无法实现您的 AppDatabase class (AppDatabase_Impl)。 AppDatabase_Impl needs to be able to call the super constructor. AppDatabase_Impl 需要能够调用超级构造函数。

You can change the constructor's access modifier to protected:您可以将构造函数的访问修饰符更改为受保护:

protected AppDatabase(){}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM