用房间数据库替换共享首选项 - 但数据不持久

问题描述 投票:0回答:1

我是自学的,所以如果我缺少一些基础知识,请原谅我。根据我通过 Google Play 控制台收到的一些错误以及随后的阅读,我现在的理解是共享首选项不再是保存数据的最佳解决方案。因此,我尝试切换到房间数据库作为建议的最佳替代方案。

我更新了我的游戏,它似乎运行得很好,当我从 onStart 返回时,数据保存正常。游戏从我中断的地方开始。

但是,当我在应用程序被销毁后返回时,之前游戏的任何数据似乎都没有被保存,我的游戏从零开始。因此,看来我错过了一个步骤 - 将数据实际写入设备内部存储的步骤 - 然后是检索数据的后续步骤。

我不期望在这里提供确切的代码,我只是希望能够指出正确的方向,以实现我需要阅读/研究的内容。

不幸的是我的代码是Java,所以希望这不是问题。代码如下:

@Entity(tableName = "DatabasePiles")
public class DatabasePiles {

    @PrimaryKey (autoGenerate = true)
    @ColumnInfo(name = "pile_id")
    public int pile_id;

    @ColumnInfo(name = "db_pile_number")
    public Integer db_pile_number;

    @ColumnInfo(name = "db_card_1")
    public Integer db_card_1;

    @ColumnInfo(name = "db_card_2")
    public Integer db_card_2;

    /// constructor, getters, setters, etc.
} 

我的DAO:

@Dao
public interface DatabasePilesDAO {

     @Insert
    public void addDatabasePile(DatabasePiles databasePiles);

    @Query("select * from databasePiles")
    public List<DatabasePiles> getAllDatabasePiles();

    @Query("select * from databasepiles where pile_id ==:pile_id")
    public DatabasePiles getDataBasePile(int pile_id);
}

数据库Java类:

@Database(entities = {DatabasePiles.class}, version = 1)
public abstract class DatabaseForDatabasePiles extends RoomDatabase {

    public abstract  DatabasePilesDAO getDatabasePilesDAO();

}

在我的代码中,我有一个方法来保存“堆”(int [])到房间,如下所示:

 RoomDatabase.Callback myCallBack = new RoomDatabase.Callback() {
                    @Override
                    public void onCreate(@NonNull SupportSQLiteDatabase db) {
                        super.onCreate(db);
                    }

                    @Override
                    public void onOpen(@NonNull SupportSQLiteDatabase db) {
                        super.onOpen(db);
                    }
                };


dbForDatabasePiles = Room.databaseBuilder(getApplicationContext(), DatabaseForDatabasePiles.class,"DBForDatabasePiles").addCallback(myCallBack).build();


int[] example = new int[]{1, 2, 3}
int pile_id = 1

DatabasePiles examplePile1 = new DatabasePiles(pile_id, example[0], example[1], example[2]}

dbForDatabasePiles.getDatabasePilesDAO().addDatabasePile(examplePile1);

这就是我检索数据的方式:

DatabasePiles dbPile = dbForDatabasePiles.getDatabasePilesDAO().getDataBasePile(1);
// where (1) is the pile_id
java android sharedpreferences android-room android-internal-storage
1个回答
0
投票

然而,当我在应用程序被破坏后返回时

如果被破坏,则意味着该应用程序已被有效卸载,那么您将丢失所有数据,因为数据库属于该应用程序。也就是说数据库将存储在 data/data/whatever_package_is/databases 中。

将有 1 或 3 个文件,该文件根据数据库名称作为调用的第三个参数传递给

Room.databaseBuilder

可能存在一个带有 -wal 后缀的同名文件(write-ahead log)。 可能存在一个同名后缀为 -shm 的文件(共享内存,wal 文件的日志)。

例如(根据您代码的工作演示(修改/适应以适应(简洁和方便))):-

相应包中的所有文件(在演示中a.a.so77089546javaroomnot savingdata)都属于该应用程序。如果应用程序被卸载/丢失/毁坏,那么数据库会随着应用程序一起消失。

当然,使用您有权访问的模拟器,您也可以通过设备资源管理器删除文件(用于获取屏幕截图),这将导致数据库丢失。

如果您需要防止这种情况,那么事情会更加复杂,因为您需要从其他地方访问数据库,或者有一个可以从其他地方备份和恢复数据库的过程(例如外部存储(不一定是外部的)) ).

© www.soinside.com 2019 - 2024. All rights reserved.