【问题标题】:How to save/load BigInteger array如何保存/加载 BigInteger 数组
【发布时间】:2015-04-09 10:25:55
【问题描述】:

我想将 BigInteger 数组保存/加载到 SharedPreferences 中/从中加载。 怎么办?

例如对于以下数组:

private BigInteger[] dataCreatedTimes = new BigInteger[20];

【问题讨论】:

标签: java android casting sharedpreferences biginteger


【解决方案1】:

使用 Gson 您可以转换为 json String 并返回,这当然使得保存在首选项中变得微不足道:

import com.google.gson.Gson;

import java.math.BigInteger;

public final class BigIntegerArrayJson {    
    private BigIntegerArrayJson(){}

    public static String toJson(BigInteger[] array) {
        return new Gson().toJson(array);
    }

    public static BigInteger[] fromJson(String json) {
        return new Gson().fromJson(json, BigInteger[].class);
    }
}

在 gradle 中添加 Gson 添加依赖:

dependencies {
    compile 'com.google.code.gson:gson:1.7.2'
}

【讨论】:

    【解决方案2】:

    考虑bigInts 是您想要来自PreferenceBigInteger[]

    BigInteger[] bigInts = new BigInteger[n];
    Set<String> set = new HashSet<String>();
    
    for(BigInteger bigInt : bigInts) {
        set.add(bigInt.toString());
    }
    
    //store into Preference
    SharedPreference.Editor editor = getSharedPreference(getPackageName(), Context.MODE_PRIVATE).edit();
    editor.putStringSet("bigints", set);
    
    //get BitInteger[] from Preference
    SharedPreference pref = getSharedPreference(getPackageName(), Context.MODE_PRIVATE);
    
    Set<String> set = pref.getStringSet("bigints", new HashSet<String>());
    int count = set.size();
    
    String[] strs = new String[count];
    BigInteger[] bigInts= new BigInteger[count];
    set.toArray(strs);
    
    for(int i = 0; i < count; i++) {
        bitInts[i] = new BigInteger(strs[i]);
    }
    

    【讨论】:

    • 感谢@SilentKnight:但我在“set.add(bigInt) 行中遇到错误“Set 类型中的方法 add(String) 不适用于参数 (BigInteger)” "
    • 在“Set.toArray(strs);”行中也出现错误“无法从 Set 类型对非静态方法 toArray(Object[]) 进行静态引用”
    • 再试一次。 PS:你是初学者吗?
    • 对不起,我没有在 Set 中看到“S”。我的错。是的,Android 初学者。我很抱歉。我会检查并让你知道它是否有效。再次感谢
    • 在我看来是充分利用 API 的最佳解决方案。 +1
    【解决方案3】:
        final String DELIMITER = "BOND";
        final int DELIMITER_LENGTH = 4;
        String str = "";
        BigInteger[] integer = new BigInteger[50];
    
        for(int i = 0; i < integer.length ; i++) {
            str += integer[i].toString() + DELIMITER;
        }
    
     savePreference("your_key", str);
    

    这是您的保存偏好方法

    public static void savePreference(String iName, String iValue) {
            SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(
                    MainApplication.getsApplicationContext()).edit();
            // Check that passed key is not null
            if (iName != null && iValue != null) {
                editor.putString(iName, iValue);
                editor.commit();
            }
        }
    

    现在取回您的 BigInteger 值,

    String str = loadPreference("your_key");
    ArrayList<BigInteger> myBigInt = new ArrayList<>();
    
    
            while(str != null){
                int subStringLastIndex = 0;
                if(str.contains(DELIMITER) && str.length() != DELIMITER_LENGTH){
                  subStringLastIndex = str.indexOf(DELIMITER.charAt(0));
                myBigInt.add(new BigInteger(str.substring(0, subStringLastIndex)));
                str = str.substring(subStringLastIndex + 4);
    
                }else{
                    str = null;
                }
            }
    
        for(int i = 0; i < myBigInt.size(); i++){
            Log.d(TAG, myBigInt.get(i).toString());
        }
    

    这是你的 loadPreference 方法

    public static String loadPreference(String iName) {
                return PreferenceManager.getDefaultSharedPreferences(MainApplication.getsApplicationContext()).
                        getString(iName,null);
            }
    

    注意:您可以随意更改分隔符,但更喜欢使用字符数组。相应地更改分隔符长度

    试试这个,让我知道它是否有效

    【讨论】:

    • Dabrai - 谢谢,您也可以发布检索方法吗?检索时我会在数组中取回我的数据吗?我会检查并通知你
    • 您可能希望在循环中连接时使用 StringBuilder。
    • 感谢 Abhishek,这是有效的,我面临的唯一问题是在检索时我打印了 20 次结果,这意味着我将收到 20 次相同的条目。这里可能有什么问题?
    • 我的结果似乎没有错,你确定数组有不同的元素吗?因为这是看起来在这里的唯一原因。
    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 2020-02-25
    • 2019-04-04
    • 2012-09-24
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多