问题描述
我尝试使用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.
这篇关于会议室:未创建数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!