本文介绍了房间:数据库未创建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用谷歌架构中的房间图书馆.我根据谷歌的 BasicSample 编写了一些代码,但没有创建数据库(对于我的代码).Logcat 不包含错误和异常.请帮我找出我的错误:

I try use room library from google architecture. I write few codes based on the BasicSample from google, but database not created (for my code). Logcat does not contains errors and exceptions. Please help me find my mistake:

//App.java
//...
public class App extends Application {
    private AppExecutors mAppExecutors;
    private static final String TAG = "App";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate: enter");
        mAppExecutors = new AppExecutors();
        getDatabase();
    }

    public AppDatabase getDatabase() {
        return AppDatabase.getInstance(this, mAppExecutors);
    }
}

我的 AppDatabase 类看起来:

My AppDatabase class looks:

//AppDatabase.java
//...
@Database(entities = {Camera.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    private static final String DATABASE_NAME = "mydatabase";
    private static AppDatabase sInstance;
    private AppExecutors mExecutors;
    public abstract CameraDao cameraModel();

    public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
        if (sInstance == null) {
            synchronized (AppDatabase.class) {
                if (sInstance == null) {
                    sInstance = buildDatabase(context.getApplicationContext(), executors);
                }
            }
        }
        return sInstance;
    }
    private static final String TAG = "AppDatabase";
    private static AppDatabase buildDatabase(final Context context, final AppExecutors executors) {
        Log.i(TAG, "buildDatabase: enter");
        AppDatabase database = Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME)
                .addCallback(new Callback() {

                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {
                        Log.i(TAG, "onCreate: ");
                        super.onCreate(db);

                        executors.diskIO().execute(() -> getInstance(context, executors).initDb());
                    }
                })
                .build();
        database.mExecutors = executors;
        Log.i(TAG, "buildDatabase: exit");
        return database;
    }

    private void initDb() {
        cameraModel().insert(new Camera(1, "Canon", "EOS 5d Mark III", 1024, 768, 24, 22, 0.0, true));
    }
}

道接口:

//CameraDao.java
@Dao
public interface CameraDao {
    @Insert
    void insert(Camera camera);
}

和实体类:

// Camera.java
@Entity
public class Camera {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public String list_name;
    public String camera_name;
    public int max_resolution_width;
    public int max_resolution_height;
    public int max_sensor_width;
    public int max_sensor_height;
    public double coc;
    public boolean is_auto_coc;

    public Camera(long id, String list_name, String camera_name, int max_resolution_width, int max_resolution_height, int max_sensor_width, int max_sensor_height, double coc, boolean is_auto_coc) {
        this.id = id;
        this.list_name = list_name;
        this.camera_name = camera_name;
        this.max_resolution_width = max_resolution_width;
        this.max_resolution_height = max_resolution_height;
        this.max_sensor_width = max_sensor_width;
        this.max_sensor_height = max_sensor_height;
        this.coc = coc;
        this.is_auto_coc = is_auto_coc;
    }

    @Ignore
    public Camera(String list_name, String camera_name, int max_resolution_width, int max_resolution_height, int max_sensor_width, int max_sensor_height, double coc, boolean is_auto_coc) {
        this.list_name = list_name;
        this.camera_name = camera_name;
        this.max_resolution_width = max_resolution_width;
        this.max_resolution_height = max_resolution_height;
        this.max_sensor_width = max_sensor_width;
        this.max_sensor_height = max_sensor_height;
        this.coc = coc;
        this.is_auto_coc = is_auto_coc;
    }
}

因此,无法使用此代码创建数据库.未调用创建数据库的回调.顺便说一句,如果我有自动增量字段,是否可以插入自定义值(对于特殊情况).

So, with this code database could not created. Callback for create db not called. Btw, if I have autoincrement field is it possible insert custom value (for special conditions).

我的代码日志:

12-04 00:54:47.536 9150-9150/ru.neverdark.photonotes I/App: onCreate: enter

12-04 00:54:47.537 9150-9150/ru.neverdark.photonotes I/AppDatabase: buildDatabase: enter

12-04 00:54:47.537 9150-9150/ru.neverdark.photonotes I/AppDatabase: buildDatabase: enter

12-04 00:54:47.541 9150-9150/ru.neverdark.photonotes I/AppDatabase: buildDatabase: exit

12-04 00:54:47.541 9150-9150/ru.neverdark.photonotes I/AppDatabase: buildDatabase: exit

推荐答案

在幕后,Room 默认使用 SQLiteOpenHelper,就像您直接使用它一样.

Under the covers, by default, Room uses SQLiteOpenHelper, much as you might use it directly.

SQLiteOpenHelper 不会创建数据库.一旦您调用 getReadableDatabase()getWriteableDatabase() ,它就会这样做.

SQLiteOpenHelper does not create the database when you create the SQLiteOpenHelper instance. It will do so once you call getReadableDatabase() or getWriteableDatabase().

从 Room 的角度来看,这意味着除非您执行某些具体操作,例如调用命中数据库的 @Dao 方法,否则不会创建您的数据库.

From a Room standpoint, that means until you perform some concrete operation, such as invoking a @Dao method that hits the database, your database will not be created.

这篇关于房间:数据库未创建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-23 00:57