我是自学的,所以如果我缺少一些基础知识,请原谅我。根据我通过 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
然而,当我在应用程序被破坏后返回时
如果被破坏,则意味着该应用程序已被有效卸载,那么您将丢失所有数据,因为数据库属于该应用程序。也就是说数据库将存储在 data/data/whatever_package_is/databases 中。
将有 1 或 3 个文件,该文件根据数据库名称作为调用的第三个参数传递给
Room.databaseBuilder
可能存在一个带有 -wal 后缀的同名文件(write-ahead log)。 可能存在一个同名后缀为 -shm 的文件(共享内存,wal 文件的日志)。
例如(根据您代码的工作演示(修改/适应以适应(简洁和方便))):-
相应包中的所有文件(在演示中a.a.so77089546javaroomnot savingdata)都属于该应用程序。如果应用程序被卸载/丢失/毁坏,那么数据库会随着应用程序一起消失。
当然,使用您有权访问的模拟器,您也可以通过设备资源管理器删除文件(用于获取屏幕截图),这将导致数据库丢失。
如果您需要防止这种情况,那么事情会更加复杂,因为您需要从其他地方访问数据库,或者有一个可以从其他地方备份和恢复数据库的过程(例如外部存储(不一定是外部的)) ).