【问题标题】:How to store intent inside the android local database?如何将意图存储在android本地数据库中?
【发布时间】:2017-03-09 02:33:21
【问题描述】:

我在将 intent.putExtra 存储在 android 本地数据库中时遇到问题。我正在为我的项目创建一个像 4Pics1Word 这样的游戏。它只有 25 个关卡,所以我创建了 25 个活动并将其随机化。解决特定活动后,它将被删除到类的 ArrayList,ArrayList<Class>。现在,我使用intent.putExtra("ACTIVITY_LIST", activityList); 来存储意图并将其传递给下一个活动。我的问题是我无法将其存储在本地数据库中。当我退出游戏时,进度没有保存,它从第一关重新开始。有什么建议么?谢谢!

这是我的 Main Activity 中的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

Button btnStart;
Context context;
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btnStart = (Button) findViewById(R.id.btnStart);
    btnStart.setOnClickListener(this);

}

@Override
        public void onClick(View v) {
            // We are creating a list, which will store the activities that haven't been opened yet
    ArrayList<Class> activityList = new ArrayList<>();
    activityList.add(first.class);
    activityList.add(second.class);
    activityList.add(third.class);
    activityList.add(fourth.class);
    activityList.add(fifth.class);

            Random generator = new Random();
            int number = generator.nextInt(5) + 1;

            Class activity = null;

            switch(number) {
                case 1:
                    activity = first.class;
                    activityList.remove(first.class);
                    break;
                case 2:
                    activity = second.class;
                    activityList.remove(second.class);
                    break;
                case 3:
                    activity = third.class;
                    activityList.remove(third.class);
                    break;
                case 4:
                    activity = fourth.class;
                    activityList.remove(fourth.class);
                    break;
                default:
                    activity = fifth.class;
                    activityList.remove(fifth.class);
                    break;
            }

            Intent intent = new Intent(getBaseContext(), activity);
            intent.putExtra("ACTIVITY_LIST", activityList);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(activityList); // myObject - instance of MyObject
    prefsEditor.putString("MyObject", json);
    prefsEditor.commit();
            startActivity(intent);
        }

}

这是我的 first 活动中的代码:

public class first extends AppCompatActivity implements View.OnClickListener{
EditText etAnswer;
Button btnGo;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
    etAnswer = (EditText) findViewById(R.id.etAnswer);
    btnGo = (Button) findViewById(R.id.btnGo);
    btnGo.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.btnGo:
            String answer = etAnswer.getText().toString();
            if(answer.equals("Jose Rizal") ||  answer.equals("jose rizal") || answer.equals("Rizal") || answer.equals("rizal") ){
                AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);
                dlgAlert.setMessage("The famous Rizal monument in Luneta was not the work of a Filipino but a Swiss sculptor named Richard Kissling?" +
                        "\n" +
                        "\n" +
                        "Source: http://www.joserizal.ph/ta01.html");
                dlgAlert.setTitle("Did you know that ...");
                dlgAlert.setPositiveButton("Next",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                ArrayList<Class> activityList = new ArrayList<>();
                                Bundle extras = getIntent().getExtras();
                                activityList = (ArrayList<Class>) extras.get("ACTIVITY_LIST");

                                if(activityList.size() == 0) {
                                    Context context = getApplicationContext();
                                    CharSequence last = "Congratulations! You just finished the game! Please wait for the next update!";
                                    int durationFinal = Toast.LENGTH_LONG;

                                    Toast toast = Toast.makeText(context, last, durationFinal);
                                    toast.show();
                                } else {
                                    // Now, the random number is generated between 1 and however many
                                    // activities we have remaining
                                    Random generator = new Random();
                                    int number = generator.nextInt(activityList.size()) + 1;

                                    Class activity = null;

                                    // Here, we are checking to see what the output of the random was
                                    switch(number) {
                                        case 1:
                                            // We will open the first remaining activity of the list
                                            activity = activityList.get(0);
                                            // We will now remove that activity from the list
                                            activityList.remove(0);
                                            break;
                                        case 2:
                                            // We will open the second remaining activity of the list
                                            activity = activityList.get(1);
                                            activityList.remove(1);
                                            break;
                                        case 3:
                                            // We will open the third remaining activity of the list
                                            activity = activityList.get(2);
                                            activityList.remove(2);
                                            break;
                                        case 4:
                                            // We will open the fourth remaining activity of the list
                                            activity = activityList.get(3);
                                            activityList.remove(3);
                                            break;
                                        default:
                                            // We will open the fifth remaining activity of the list
                                            activity = activityList.get(4);
                                            activityList.remove(4);
                                            break;
                                    }

                                    // Note: in the above, we might not have 3 remaining activities, for example,
                                    // but it doesn't matter because that case wouldn't be called anyway,
                                    // as we have already decided that the number would be between 1 and the number of
                                    // activities left.


                                    // Starting the activity, and passing on the remaining number of activities
                                    // to the next one that is opened
                                    Intent intent = new Intent(getBaseContext(), activity);
                                    intent.putExtra("ACTIVITY_LIST", activityList);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                    startActivity(intent);
                                }
                            }
                        });
                dlgAlert.setCancelable(true);
                dlgAlert.create().show();

            }else{
                Context context = getApplicationContext();
                CharSequence text = "Wrong! Try Again.";
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }
            break;
    }
}

}

【问题讨论】:

  • I created 25 activities。不要那样做。
  • 如何创建 4Pics1Word 游戏?我这样做只是因为我是 android 的初学者,而且我不知道怎么玩游戏。考虑到它只有 25 个级别。
  • 如果您在所有级别使用相同的设计,那么您只需要 1 个活动。只是屏幕上的信息被改变了。
  • 我该怎么做?请帮助ppp
  • 恩佐基是对的。您所要做的就是更改视图中显示的内容以及图像的值,一旦有人得到正确答案,您就不需要创建 25 个活动。想象一下使用 switch(level) 然后等等。

标签: java android sqlite android-intent sharedpreferences


【解决方案1】:
  1. 每次来到 MainActivity 时,您都会新建一个 ArrayList 并添加所有活动,而不是从本地 SharedPreferences 获取缓存。
  2. 当您在 Activity 中完成一场游戏时,您没有将进度保存在缓存中。

更新数组列表后,像这样保存你的数组列表:

SharedPreferences.Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(activityList); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();

当你想读取保存的arrayList时,这样做:

String arrayStr = mPrefs.getString("myObject","defValue");
Gson gson = new Gson();
List<Class> array = gson.fromGson(arrayStr,new TypeToken<List<Class>>(){}.getType());
if(array==null){
    array = new ArrayList<>();
    array.add(...);
}

【讨论】:

  • 这包含在我的主要活动中。我在保存数组列表然后在本地存储的下一个活动中再次获取它时遇到问题
  • 那么有什么异常吗?如果有,请显示日志。
  • 没有。我只是无法将更新后的 ArrayList 存储在本地数据库中。
  • 完成游戏后而不是保存它缓存我可以在哪里保存它以及如何保存?
  • MainActivity一样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2023-01-27
  • 2013-11-01
  • 2023-03-23
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多