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

问题描述

我尝试使用Google体系结构中的会议室库.我根据Google的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));
    }
}

Dao界面:

//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;
    }
}

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

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.537 9150-9150/ru.neverdark.photonotes I/AppDatabase:buildDatabase:输入

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:退出

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:55