简体   繁体   English

房间:未创建数据库

[英]Room: Database not created

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).我根据谷歌的 BasicSample 编写了一些代码,但没有创建数据库(对于我的代码)。 Logcat does not contains errors and exceptions. Logcat 不包含错误和异常。 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);
    }
}

My AppDatabase class looks:我的 AppDatabase 类看起来:

//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 interface:道接口:

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

And Entity class:和实体类:

// 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).顺便说一句,如果我有自动增量字段,是否可以插入自定义值(用于特殊条件)。

My logcat for this code:这段代码的日志:

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

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

Under the covers, by default, Room uses SQLiteOpenHelper , much as you might use it directly.在幕后,默认情况下,Room 使用SQLiteOpenHelper ,就像您可能直接使用它一样。

SQLiteOpenHelper does not create the database when you create the SQLiteOpenHelper instance.创建SQLiteOpenHelper实例时, SQLiteOpenHelper不会创建数据库。 It will do so once you call getReadableDatabase() or getWriteableDatabase() .一旦您调用getReadableDatabase()getWriteableDatabase() ,它就会这样做。

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.从 Room 的角度来看,这意味着在您执行一些具体操作之前,例如调用命中数据库的@Dao方法,您的数据库将不会被创建。

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

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