1

当我运行代码时,我得到 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();
    }
};

}

4

1 回答 1

0

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

你需要使用SupportSQLiteDatabase方法。比如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)仅表示需要的列名,并且该名称可能是。同样,表名pets(插入的第一个参数)只是指示性的。
于 2021-07-01T21:00:59.607 回答