繁体   English   中英

存储字符串键值对

[英]Store String Key-value pair

我正在开发一个Android应用程序,该应用程序的主要工作是有一台扫描仪,我必须再次扫描一次并将结果存储在键值对中。

  [
   {
    "0" : "816444014066",
    "1" : "747083010945",
    "2" : "816444010969"
  }
 ]

通过API,我必须按阵列发送所有扫描结果。 我通过startActivityForResult通过另一个活动获取扫描结果。用户将一次又一次扫描,通过onActivityResult用户将获取结果。我必须将所有结果存储在键值对中,最后通过POST请求通过点击按钮来创建一个按钮必须像上面的代码一样按数组发送所有扫描结果。

我可以在这里使用HashMap还是必须使用“共享首选项”来存储结果。

// Call Back method  to get the Message form other Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // check if the request code is same as what is passed  here it is 2
        if (requestCode == 2 && data!=null) {
            String message = data.getStringExtra(SCAN_RESULT);
            // textView1.setText(message);
            if(message!= null){
                Log.e("SCAN_RESULT", "" + message);

                //Adding code will be here


              }
        }
    }

这是使用hashmap保存键值的示例代码:

HashMap<String, String> data = new HashMap<String, String>();
data.put("key", "value");

或者,如果订单对您很重要,请使用linkedHashMap:

HashMap<String, String> data = new LinkedHashMap<>();

用法是相同的;)

数据结构逻辑:

哈希图用于通过其键访问内容。

在此示例中,我想您正在逐一扫描“元组”,并且每个元组都互不相同,因此您无需通过其键来访问旧元组。

因此,在这里,我建议您创建适合键-值对的模型类并将其存储在列表中。 完成后,您可以推送该列表。

元组的样本模型:

public class KeyValuePair {
    private String key;
    private String value;
    public KeyValuePair(String key, String value) {
        this.key = key;
        this.value = value;
    }
}

样品清单:

List<KeyValuePair> keyValuePairList = new ArrayList<>();
keyValuePairList.add(new KeyValuePair("0", "816444014066"));
keyValuePairList.add(new KeyValuePair("1", "747083010945"));
keyValuePairList.add(new KeyValuePair("2", "816444010969"));

储存:

如果您无法在活动之间传递数据,请签出SQLite 您可以将数据存储在SQLite中,并在需要时提取它。 这是一个可在Android设备上运行的脱机数据库。 您可以在将数据推送到上游时删除数据。

编辑:

如果键是命令,则可以简单地使用字符串列表,如下所示:

List<String> keyValuePairList = new ArrayList<>();
keyValuePairList.add("816444014066");
keyValuePairList.add("747083010945");
keyValuePairList.add("816444010969");

为此,最好使用HashMap来存储非持久数据。 由于要发布结果,因此不需要共享首选项,因此不需要永久存储。

像这样:

Map <Integer,Integer> myMap = new HashMap<Integer,Integer>();

如果您在应用程序的其他位置需要扫描结果,建议您使用SharedPreferences并放置键值对。 否则,只需使用HashMap。

建议:如果需要保持键值对的顺序,请使用LinkedHashMap并对其进行迭代。

使用哈希图存储数据,然后使用Gson将HashMap转换为String,然后将其保存到SharedPrefs

private void hashmaptest()
{
    //create test hashmap
    HashMap<String, String> testHashMap = new     HashMap<String, String>();
testHashMap.put("key1", "value1");
testHashMap.put("key2", "value2");

//convert to string using gson
Gson gson = new Gson();
String hashMapString = gson.toJson(testHashMap);

//save in shared prefs
SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
prefs.edit().putString("hashString", hashMapString).apply();

//get from shared prefs
String storedHashMapString = prefs.getString("hashString", "oopsDintWork");
java.lang.reflect.Type type = new TypeToken<HashMap<String, String>>(){}.getType();
HashMap<String, String> testHashMap2 = gson.fromJson(storedHashMapString, type);

//use values
String toastString = testHashMap2.get("key1") + " | " + testHashMap2.get("key2");
Toast.makeText(this, toastString, Toast.LENGTH_LONG).show();
}

来源: 将哈希映射保存到共享首选项中

好吧,如果要在用户关闭应用程序的情况下保存存储的键值,则需要使用以下之一:sqllite,file,sharedprefernces。 但是,如果用户关闭了该应用程序并重新启动它,那么该应用程序将是新的(键值),那么您只需使用HashMap这样的代码即可:

Map <Integer,String> hashMap = new HashMap<Integer,String>();

如果将Integer用作键,则最好使用SparseArray不是HashMap因为它使用原始键存储数据,并且比hashMap更快。

 SparseArray<String> spa = new SparseArray();
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // check if the request code is same as what is passed  here it is 2
        if (requestCode == 2 && data!=null) {
            String message = data.getStringExtra(SCAN_RESULT);
            // textView1.setText(message);
            if(message!= null){
                //Adding code will be here 
                spa.put(key,value);
              }
        }
    }

SharedPreferences用于存储小数据,因此我建议您将其存储在File并在以后读取...(如果数据很大)

首先,创建一个Object ,例如HashMap<String,String> ,如下所示:

HashMap<String, String> data = new HashMap<String, String>();
data.put("0", "816444014066");
...

现在,您可以创建那些方法来存储信息:

public static synchronized void saveData(Context context, Object object, String filename) {
        try {
            String tempPath = context.getFilesDir() + "/" + filename+ ".bin";
            File file = new File(tempPath);
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(object);
            oos.flush();
            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

然后,如果您想读取数据,只需执行以下操作:

public static synchronized Object readData(Context context, String filename) {
        Object obj = new Object();
        try {
            String tempPath = context.getFilesDir() + "/" + binFileName + ".bin";
            File file = new File(tempPath);
            if (file.exists()) {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
                obj = ois.readObject();
                ois.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return obj;
    }

扫描结果后,我在HashMap中创建了一个方法,将所有扫描结果一一添加。

 LinkedHashMap<String, String> data = new LinkedHashMap<String, String>();

  // Call Back method  to get the Message form other Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // check if the request code is same as what is passed  here it is 2
    if (requestCode == 2 && data!=null) {
        String message = data.getStringExtra(SCAN_RESULT);
       if(message!= null){
            Log.e("SCAN_RESULT", "" + message);
            showBarCodeContentDialoig(message);
            storeScanValue(scanResult);
        }
    }
}

在onCreate()之外;

 private void storeScanValue(String scanResult) {
    count++;
    data.put(String.valueOf(count), scanResult);
    Log.e("Key_Value",""+count);
    Log.e("SIZE",""+data.size());
  }

要将结果“一个活动”发送到另一个活动:

 Gson gson = new Gson();
    String list = gson.toJson(data);
    Intent intent = new Intent(AdjustInventoryCount.this, AdjustInventory.class);
    intent.putExtra("list", list);
    startActivity(intent);

用于接收来自先前活动的数据:

String str=  getIntent().getStringExtra("list");
    Gson gson = new Gson();

    Type entityType = new TypeToken< LinkedHashMap<String, String>>(){}.getType();
    data = gson.fromJson(str, entityType);

    String jsonList = gson.toJson(data, LinkedHashMap.class);

    Log.e("list", ""+jsonList);
    Log.e("Size", ""+data.size());

通过这种方式,我得到了存储在LinkedHashMap中的原始序列明智结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM