我无法将对象添加到我的数据库,因为我无法在我的后台线程中初始化 Dao 对象。甚至 db.PetsDao() 也无济于事

I am unable to add objects to my database as I am not able to initialize the Dao object in my background thread . even db.PetsDao() isn't helping

当我 运行 代码时,我得到 petsDao 是一个空对象引用,如果我尝试 db.PetsDao() 初始化,它没有帮助。我是 android 的新手,请帮助我。

@Database(entities = {Pets.class},version = 1)
public abstract class PetsDatabase extends RoomDatabase {

private static PetsDatabase instance;

public abstract PetsDao petsDao();

public static synchronized PetsDatabase getInstance(Context context){
    if (instance == null){
        instance = Room.databaseBuilder(context.getApplicationContext(),
                PetsDatabase.class,"Pets_Database")
                .fallbackToDestructiveMigration()
                .addCallback(roomCallback)
                .build();
    }

    return instance;
}

//This method is to insert dummy data in the database when the database is first created
public static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback(){
    @Override
    public void onCreate(@NonNull @NotNull SupportSQLiteDatabase db) {
        super.onCreate(db);

        Runnable runnable = new Runnable() {
            private PetsDao petsDao;
            @Override
            public void run() {
                petsDao.insert(new Pets("Tommy","Terrier","Male"));
                petsDao.insert(new Pets("Snoopy","Unknown","Male"));
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }
};

}

调用 onCreate 时,数据库刚刚创建,Room 构建不完整(未完全实例化),因此您不能使用 Dao 的。

你需要使用 SupportSQLiteDatabase methods. Such as insert 所以你会有这样的东西:-

ContentValues cv = new ContentValues();
cv.put("pet_name_column","Tommy");
cv.put("pet_breed_column","Terrier");
cv.put("pet_gender","Male");
db.insert("pets",SQLiteDatabase.CONFLICT_IGNORE,cv);
cv.clear();
.... and so on
  • 请注意,pet_name_column 等列名仅表示需要的列名,并且该名称可能是。同样,table 名称 pets(插入的第一个参数)只是指示性的。