首页 > 解决方案 > 我如何在我的 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);

}

}

标签: javaandroidfirebasesharedpreferencesadapter

解决方案


除了阿波罗的答案。从事类似的任务,所以我决定补充答案。

创建级别类:

@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;

推荐阅读