java - 我如何在我的 android 应用程序中保存打开的关卡
问题描述
我有一个由 java 编码的问答游戏(使用 android studio)。我的问题是我如何保存用户打开的关卡,当用户关闭应用程序时,什么都没有保存,用户必须再次从 1 级开始玩游戏,我尝试使用 SharedPreferences 但它不起作用,因为我的应用程序中有很多类别,每个类别都有很多级别,所以即使 SharedPreferences 工作它也无济于事,因为它将保存用户未打开的所有类别的级别
编辑:对不起,我忘了说我在我的应用程序中使用实时数据库(firebase)&有没有办法 exepet 房间数据库
public class SetsActivity extends AppCompatActivity {
private GridView gridView;
private AppCompatDialog loadingDialoge;
private sets_adapter adapter;
private AdView mAdView;
private int l,sets,level;
private String title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sets);
Toolbar toolbar=findViewById(R.id.sets_toolbar);
gridView=findViewById(R.id.sets_gv);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(title);
l=getIntent().getIntExtra("lvl",0);
title=getIntent().getStringExtra("title");
sets=getIntent().getIntExtra("sets",0);
loadlvl();
adapter=new sets_adapter(sets,title,level);
gridView.setAdapter(adapter);
}
//on back item click
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId()==android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
@Override
protected void onPause() {
savelevel();
super.onPause();
finish();
}
private void savelevel(){
SharedPreferences savechange = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = savechange.edit();
editor.putInt("lvl",l);
editor.commit();
}
private void loadlvl(){
SharedPreferences savechange = this.getPreferences( Context.MODE_PRIVATE);
level=savechange.getInt("lvl",-1);
}
}
解决方案
除了阿波罗的答案。从事类似的任务,所以我决定补充答案。
创建级别类:
@Entity
public class Level {
@PrimaryKey
public int id;
@ColumnInfo(name = "number")
public int number;
@ColumnInfo(name = "level_name")
public String levelName;
@ColumnInfo(name = "is_open")
public boolean isOpen;
public Level(int id, int number, String levelName, boolean isOpen) {
this.id = id;
this.levelName = levelName;
this.isOpen = isOpen;
this.number = number;
}
}
道类:
@Dao
public interface LevelDao {
@Insert
void insertAll(Level... levels);
@Query("UPDATE level SET is_open = :isOpen WHERE level_name = :levelName")
void updateLevel(String levelName, boolean isOpen);
@Query("SELECT * FROM level WHERE number LIKE :numberLevel")
Level findByNumber(int numberLevel);
...
}
级别数据库类:
@Database(entities = {Level.class}, version = 1)
public abstract class LevelDatabase extends RoomDatabase {
public abstract LevelDao levelDao();
}
首次启动应用程序时,仅打开第一级:
AsyncTask.execute(() -> {
dbLevels = Room.databaseBuilder(this.getApplicationContext(), LevelDatabase.class,
"levels-database").addCallback(dbCallback).build();
LevelDao dao = dbLevels.levelDao();
});
...
// only called once
RoomDatabase.Callback dbCallback = new RoomDatabase.Callback() {
public void onCreate(@NonNull SupportSQLiteDatabase db) {
Executors.newSingleThreadScheduledExecutor().execute(() -> {
Level level1 = new Level(0, 1, "level1", true);
Level level2 = new Level(1, 2, "level2", false);
dbLevels.levelDao().insertAll(level1, level2);
});
}
};
要在游戏中打开关卡:
AsyncTask.execute(() -> {
LevelDatabase dbLevels = Room.databaseBuilder(gameActivity.getApplicationContext(),
LevelDatabase.class, "levels-database").build();
LevelDao dao = dbLevels.levelDao();
dao.updateLevel("level2", true);
});
检查是否打开:
dao.findByNumber(2).isOpen;
推荐阅读
- java - 无法在linux上的路径中运行jar可执行文件
- ssis - SSIS - 仅根据结果导出列
- python - 如何为数据框中列中具有特定字符串的两行之间的行分配值?
- html - Bootstrap 适合子内容并让其他子滚动
- react-native - 绝对定位的 View 在 react-native 中不能作为覆盖层
- sql - PostgreSQL 统计每个学生的最高成绩数
- forms - Svelte:在使用主要 CSS 框架(如 Bootstrap/Material/SemanticUI)的同时集成表单验证?
- javascript - 在 Vue 应用程序上根据条件 v-if 和 else 显示内容
- r - 根据 R 中的条件扩展矩阵
- django - 外键和预定义值的组合作为 Django 模型字段的选择