Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
463 views
in Technique[技术] by (71.8m points)

android - 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). 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);
    }
}

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 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.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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

SQLiteOpenHelper does not create the database when you create the SQLiteOpenHelper instance. It will do so once you call getReadableDatabase() or 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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...