【问题标题】:How to create new instance dynamically? [closed]如何动态创建新实例? [关闭]
【发布时间】:2016-11-06 06:02:29
【问题描述】:

我想通过 sharedPreference 存储一些汽车详细信息。并且有不止一组数据。当车号不存在时,它将创建新的 sharedPreference 实例。

所以实例的名称不能与前一个相同。但我不知道动态创建 sharedpreference 的新实例。

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.search_btn:
            responseText.setText("");
            mList = new ArrayList<SharedPreferences>();
            String isNum = textNum.getText().toString();
            Iterator iterator = mList.iterator();

            while (iterator.hasNext()){
                if((iterator.next().toString()).equals(isNum)){
                    Log.i("information","exist!");
                    break;

                }else {
                    SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);


                    mList.add(pref);
                    SharedPreferences.Editor editor = pref.edit();
                    editor.putString("type", textType.getText().toString());
                    editor.putString("num", textNum.getText().toString());
                    editor.putString("car", textCar.getText().toString());
                    editor.commit();
                    break;
                }
            }
            break;
     }
}   

编辑:我正在尝试将汽车的详细信息(车辆类型车牌号车辆识别号)存储到Sharedpreference .我想将其存储为列表。我只想在 Sharedpreference 中不存在的情况下添加详细信息。

【问题讨论】:

  • 我不知道你想做什么。
  • 我想通过共享偏好存储数据,但是我不知道如何动态创建共享偏好变量
  • 为什么要创建另一个实例?
  • 在 sharedpreference 中添加新车数据。
  • 在 sharedpreference 中添加键/值对,而不是为每个项目添加新的 sharedpreference 文件,我认为更适合您的要求的是使用数据库(Sqlite)。

标签: java android sharedpreferences


【解决方案1】:

您需要一个 POJO 类来保存您的汽车的详细信息。

private class Car {
    public String num;
    public String car;

    // getters and setters
    public void setNum(String num){
        this.num = num;
    }

    public String getNum(){
        return num;
    }


    public void setCar(String car){
        this.car = car;
    }

    public String getCar(){
        return car;
    }

}

您可以使用 GSON library 将您的汽车列表转换为 JSON 并将其存储在您的 SharedPreferences 中。
onClick 方法,

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.search_btn:
            responseText.setText("");
            String isNum = textNum.getText().toString();

            // create an instance of SharedPreferences
            SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
            String value = pref.getString("cardata", "");
            Type type = new TypeToken<ArrayList<Car>>() {}.getType()
            Gson gson = new Gson();
            ArrayList<Car> cars = gson.fromJson(value, type);

            // linear search
            boolean flag = false;
            for (Car car : cars) {
                if(car.num.equals(isNum)){
                    flag = true;
                    break;
                }
            }

            // not found. add new car
            if(!flag){
                cars.add(new Car(textCar.getText().toString(), textNum.getText().toString()));
                SharedPreferences.Editor editor = pref.edit();
                editor.putString("cardata", gson.toJson(cars));
                editor.apply();
            }
     }
}

注意:对于大量汽车,您的共享偏好可能很大。如果是这种情况,请切换到数据库。

【讨论】:

  • 第一次运行的时候,其实Json中是null。并且汽车为空----java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.util.Iterator java.util.ArrayList.iterator()'
  • 是的,这只是逻辑。您需要进行一些调整以使其符合您的要求。我希望你能明白。
  • 知道了。谢谢!!
【解决方案2】:

让我把话题说清楚。你不会使用实例。您将使用另一个密钥。就这么简单。

我不确定,但会这样想;您将设备本地添加到汽车列表。每辆车都有一个编号。

你应该学习键值对的东西。

else块中的代码可以是这样的;

    SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);  
    // mList.add(pref); i removed this line. sharedPreferences use Singleton.
    SharedPreferences.Editor editor = pref.edit();
    editor.putString("num-" +textNum.getText().toString(), "car-" + textCar.getText().toString());
    editor.commit();

我假设输入是数字,所以 sharedPreferences 数据会是这样的;

key : num-123 value : car-123

现在,您可以检查是否存在 num-123 键。

【讨论】:

  • 其实这辆车有3个细节需要存储。键值不够。
猜你喜欢
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多