android 如何在SharedPreferences中存储ArrayList?

oknwwptz  于 2023-05-27  发布在  Android
关注(0)|答案(6)|浏览(150)

我有一个排序ArrayList的联系人。我想将列表存储在SharedPreference中。我尝试了下面的代码:

SharedPreferences.Editor editor = app_preference.edit();
Set<String> set = new HashSet<String>();
set.addAll(contact_names_list);
editor.putStringSet("CONTACT_LIST", set);
editor.apply();

问题是,当我从HashSet中检索它时,我得到了一个未排序的列表。除了Hashset,还有其他存储ArrayList的方法吗?

pbpqsu0x

pbpqsu0x1#

检索值

Set<String> set = myScores.getStringSet("CONTACT_LIST", null);
cgyqldqp

cgyqldqp2#

static Prefs singleton = null;

public static Prefs with(Context context) {
        if (singleton == null) {
            singleton = new Builder(context).build();
        }
        return singleton;
    }

这样做-:

SharedPreferences.Editor editor = app_preference.edit();
        Set<String> set = new HashSet<String>();
        set.addAll(contact_names_list);
        editor.putStringSet("CONTACT_LIST", set);
        editor.apply();

or

Prefs.with(getAppContext()).putStringSet("CONTACT_LIST", set);

使用以下代码检索值:

Set<String> existindData = Prefs.with(getAppContext()).getStringSet("CONTACT_LIST", null);
xggvc2p6

xggvc2p63#

由于putStringSet接受任何实现Set接口的类,因此您可以使用保留插入顺序的LinkedHashSet
LinkedHashSet文件:
这个实现与HashSet的不同之处在于,它维护了一个贯穿其所有条目的双向链表。这个链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。
HashSet不保留插入顺序,这是这里的问题。

// ...

Set<String> set = new LinkedHashSet<String>();

// insert from ArrayList
set.addAll(contact_names_list);

// or single elements
set.add("Homer");
set.add("Marge");

editor.putStringSet("CONTACT_LIST", set);
3wabscal

3wabscal4#

保存arraySharedPreferences

SharedPreferences shdPre=getSharedPreferences("MainActivity",MODE_PRIVATE);
    shdPre.edit().putInt("Size",myarray.size());
    while(i<myarray.size())
    {
shdPre.edit().remove("value"+i).commit();
shdPre.edit().putString("value"+i,myarray.get(i)).commit();
i++;
}

SharedPreferences加载数组

SharedPreferences shdPre=getSharedPreferences("MainActivity",MODE_PRIVATE);
 myarray =new ArrayList();
 Int msize=shdPre.getInt("Size",null);
 while(i<msize)
{
myarray.add(shdPre.getString("value" + i, null);
i++;
}
yxyvkwin

yxyvkwin5#

正如Android文档解释的那样,https://developer.android.com/training/data-storage/shared-preferences.html?hl=en共享首选项是一种保存键值数据的方法。考虑到在后台,字典可以以几乎随机的顺序保存,您无法按顺序检索某些内容。我可以推荐几个解决方案:
1.**简单但性能不好的一个:**将索引作为值的一部分添加,因此您可以创建一个具有Hashset大小的数组,然后迭代Hashset并将每个元素添加到您创建的数组中。时间复杂度O(N)加上文件的阅读过程所涉及的时间复杂度。
1.**将数据保存在本地SQLite数据库中:**此解决方案在未来更加灵活(您可以添加新联系人)。https://developer.android.com/training/data-storage/sqlite.html通常你创建你自己的SQLite数据库,你把它放在资产中,然后你只需要导入它。您可以创建查询,以便按照所需的顺序排列它们(可能为此创建一个列)。

InputStream myInput = context.getAssets( ).open( "test.db" );

// Path to the just created empty db
String outFileName = "/data/YOUR_APP/test.db";

// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream( outFileName );

// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while( ( length = myInput.read( buffer ) ) > 0 )
{
    myOutput.write( buffer, 0, length );
}
// Close the streams
myOutput.flush( );
myOutput.close( );
myInput.close( );

1.**简单的不可扩展选项:**在值folder中,您始终可以创建一个strings.xml文件,您可以将该数据作为string-array放置。https://developer.android.com/guide/topics/resources/string-resource.html?hl=en
<string-array name="types"> <item>A</item> <item>B and users</item> <item>C</item> <item>D</item> <item>E</item> </string-array>
如果你需要一些更结构化的东西,我已经做了这样的东西(保存为JSON)。

<string-array name="quality_attributes">
        <item>{id:1,name:Performance,sub:[{id:2,name:Scalability},{id:3,name:Response_Time}]}</item>
        <item>{id:4,name:Security,sub:[{id:5,name:Availability,sub:[{id:6,name:Reliability},{id:7,name:Recovery}]},{id:8,name:Privacy}]}</item>
        <item>{id:9,name:Interoperability}</item>
        <item>{id:10,name:Maintainability}</item>
        <item>{id:12,name:Testability}</item>
        <item>{id:13,name:Usability,sub:[{id:14,name:Findability},{id:15,name:Correctness}]}</item>
    </string-array>

在我的代码中:

String[] elementsArray = getResources().getStringArray(
                R.array.quality_attributes);

        for (int i = 0; i < attributesArray.length; i++) {
            Gson gson = new Gson();
            MyJsonObject obj = gson.fromJson(elementsArray[i],
                    MyJsonObject.class);
           // Do something
        }

一般来说,如果你想改变一些东西,第二个选择是最好的。如果你正在寻找一些简单的东西,第三个选择就足够了。

ijxebb2r

ijxebb2r6#

我们可以使用Java 8的排序方式对集合进行排序。Set<String> s = new HashSet<String>(); s.add("Kunal"); s.add("Bhism"); s.add("Work"); s.add("Abdgg"); s.add("Psss"); s.add("Work"); List<Object> l = s.stream().sorted().collect(Collectors.toList()); System.out.println(l);尝试上面的代码,你现在会得到排序的HashSet。

相关问题