房间保存数据库Android?

时间:2017-07-08 12:56:19

标签: android database android-room

我正在使用Room库在database.i中保存数据。想要获取数据库。

使用此代码

private void copyFile() {

    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();
            String backupDBPath = "photex_db.db";
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它适用于简单的sqlLite,但不适用于ROOM库ROOM

有没有办法可以获得数据库?

在Room的帮助下创建DataBase的类 `

 @Database(entities = {ProjectDataEntity.class, SavedProjectEntity.class},
    version = 2)
 @TypeConverters(DateConverter.class)

 public abstract class AppDatabase extends RoomDatabase {

 static final String DATABASE_NAME = "photex_db";

 private static AppDatabase Instance;

 public abstract ProjectDataDao projectDataDao();

 public abstract SavedProjectDao savedProjectDao();

 public static AppDatabase getInstance(Context context) {
    if (Instance == null) {
        synchronized (AppDatabase.class) {
            if (Instance == null) {
                Instance = 
  Room.databaseBuilder(context.getApplicationContext(),
                        AppDatabase.class, DATABASE_NAME)
                        .build();
            }
        }
    }
    return Instance;
}

} `

6 个答案:

答案 0 :(得分:14)

static final String DATABASE_NAME = "photex_db";

在这里,您正尝试打开photoex_db

String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();

在这里,您尝试阅读photex_db.db

这些不一样。

您可以考虑始终如一地使用DATABASE_NAME,而不是仅在某些地方使用。

答案 1 :(得分:5)

在纠正其工作正常后,我的代码中出现了一点错误

private void copyFile() {
    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String currentDBPath =
                    getDatabasePath("photex_db").getAbsolutePath();
            String backupDBPath = "photex_db.db";
            //previous wrong  code  
            // **File currentDB = new File(data,currentDBPath);**
            // correct code
            File currentDB = new File(currentDBPath);
            File backupDB = new File(sd, backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

答案 2 :(得分:1)

在Android Studio中,右下角有一个名为“设备文件资源管理器”的部分。在本节中,您可以浏览所有文件 (由于需要运行根目录,因此在简单的文件资源管理器应用程序中看不到)。

确保仿真器是您正在使用的仿真器。 在此资源管理器中,您必须转到“数据”->“数据”,查找应用程序的软件包名称,下一步是找到“数据库”条目,此文件夹中有您的Room数据库。

答案 3 :(得分:0)

试试这段代码:

new

它将返回数据库的路径。使用此确切路径创建要将其复制到的文件。它肯定会对我有用。

String backupDBPath = YourRoomDatabase.getDatabase(context).getOpenHelper().getWritableDatabase().getPath();

答案 4 :(得分:0)

根据doc getDatabasePath Returns the absolute path on the filesystem where a database created with openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) is stored.,如果有会议室,则无法使用

答案 5 :(得分:0)

setValue

关注它。openHelper.writableDatabase.path 其中“它”是您从RoomDatabase继承的数据库对象