如何将收藏夹保存到Android首选项中

时间:2011-11-15 03:48:16

标签: android database sharedpreferences android-preferences

我想使用偏好设置来存储我的词典应用中最喜欢的单词。我知道这样做是不明智的(正如你们中的一些人所建议的那样),但目前使用偏好似乎是我的最佳选择。

然而,我有一个问题,即应用程序不保存喜欢的单词,虽然一切看起来都正常(我的意思是没有发现错误)。以下是我的代码:

//Saving to favourites
    btnAddFavourite = (ImageButton) findViewById(R.id.btnAddFavourite);
    btnAddFavourite.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if (prefs.getBoolean("saveFavourite", true) && mWordFavourite != null && mWordFavourite.size() >= 1)
                {
                    saveFavouriteToPreferences();
                    StringBuilder sbFavourite = new StringBuilder();
                    for (String item : mWordFavourite)
                    {
                        sbFavourite.append(item);
                        sbFavourite.append(",");
                    }

                    String strFavourite = sbFavourite.substring(0, sbFavourite.length()-1);
                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putString("favourite", strFavourite);
                    editor.commit();
                    //Log.i(CONTENT_TAG,"Favourite = " + strFavourite);
                    Log.i(CONTENT_TAG,"Favourite saved!");
                }

                Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT);
                toast.show();
            }

            private void saveFavouriteToPreferences() {
                // TODO Auto-generated method stub

            }
        });

//Loading favourites
    btnAddFavourite.setOnLongClickListener(new View.OnLongClickListener() {         

        @Override
        public boolean onLongClick(View v) {

            if (prefs.getBoolean("saveFavourite", true))
            {
                String strFavourite = prefs.getString("favourite", "");
                Log.i(CONTENT_TAG, "Favourite loaded");
                if (strFavourite != null && !strFavourite.equals(""))
                {
                    mWordFavourite = new ArrayList<String>(Arrays.asList(strFavourite.split(",")));
                }
                else
                {
                    if (mWordFavourite == null)
                    {
                        mWordFavourite = new ArrayList<String>();
                    }
                    else
                    {
                        mWordFavourite.clear();
                    }
                }
            }
            else
            {
                if (mWordFavourite == null)
                {
                    mWordFavourite = new ArrayList<String>();
                }
                else
                {
                    mWordFavourite.clear();
                }
            }

            // Open the favourite Activity, which in turn will fetch the saved favourites, to show them.
            Intent intent = new Intent(getApplicationContext(), FavouriteView.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplicationContext().startActivity(intent);  

            return false;
        }
    });
}

我认为收藏夹已加载但已保存,因为当我长按“收藏夹”按钮时,LogCat会显示“收藏夹已加载”。这是日志:

11-15 10:26:40.849: I/ActivityManager(59): Starting activity: Intent {cmp=myapp.dict/.HistoryView }
11-15 10:26:40.899: I/[Dict - Content](283): History saved!
11-15 10:26:40.979: I/[Dict - HistoryView](283): History loaded
11-15 10:26:40.989: D/[Dict - HistoryView](283): mWordHistory = 11
11-15 10:26:40.989: I/[Dict - HistoryView](283): item = english_mylang::8::"B" licence
...
11-15 10:26:41.508: I/ActivityManager(59): Displayed activity myapp.dict/.HistoryView: 607 ms (total 607 ms)
11-15 10:26:44.388: W/KeyCharacterMap(283): No keyboard for id 0
11-15 10:26:44.388: W/KeyCharacterMap(283): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-15 10:26:44.448: I/[Dict - Content](283): resultCode = 0
11-15 10:26:44.458: D/dalvikvm(59): GREF has increased to 301
11-15 10:26:54.454: I/[Dict - Content](283): Favourite loaded
11-15 10:26:54.458: I/ActivityManager(59): Starting activity: Intent { flg=0x10000000 cmp=viettien.kadict/.FavouriteView }
11-15 10:26:54.498: I/[Dict - Content](283): History saved!
11-15 10:26:54.548: I/[Dict - FavouriteView](283): Favourite loaded
11-15 10:26:54.548: D/[Dict - FavouriteView](283): mWordFavourite = 0
11-15 10:26:54.949: I/ActivityManager(59): Displayed activity myapp.dict/.FavouriteView: 448 ms (total 448 ms)

所以我的问题是:

  1. 我做错了什么?
  2. 如何改进代码?

  3. 更新:

    正如Maneesh和Alan Moore所示,“saveFavourite”(布尔值)存在问题。我现在想知道是否有任何方法可以在 onClick 之后立即进行编码以保存收藏夹。我的意思是:

    //Saving to favourites
    btnAddFavourite = (ImageButton) findViewById(R.id.btnAddFavourite);
    btnAddFavourite.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
            **//Is it possible to code to save Favourites at this stage?** 
    
                if (prefs.getBoolean("saveFavourite", true) && mWordFavourite != null && mWordFavourite.size() >= 1)
                {
                    saveFavouriteToPreferences();
                    StringBuilder sbFavourite = new StringBuilder();
                    for (String item : mWordFavourite)
                    {
                        sbFavourite.append(item);
                        sbFavourite.append(",");
                    }
    
                    String strFavourite = sbFavourite.substring(0, sbFavourite.length()-1);
                    SharedPreferences.Editor editor = prefs.edit();
                    editor.putString("favourite", strFavourite);
                    editor.commit();
                    //Log.i(CONTENT_TAG,"Favourite = " + strFavourite);
                    Log.i(CONTENT_TAG,"Favourite saved!");
                }
    
                Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT);
                toast.show();
            }
    
            private void saveFavouriteToPreferences() {
                // TODO Auto-generated method stub
    
            }
        });
    

    非常感谢。

2 个答案:

答案 0 :(得分:1)

共享偏好似乎是您需要的不错选择,因为 1)不建议将大数据存储在首选项中。 2)如果你去设置 - >你的应用程序&gt;清除设备中的数据,所有存储在首选项中的数据都将丢失 为什么不使用sqlite db?

答案 1 :(得分:0)

如果我是你,我会从Searchable Dictionary示例应用程序中大量借用 - 因为它还会搜索单词词典,因此很多功能都在那里构建:

http://developer.android.com/resources/samples/SearchableDictionary/index.html

很难调试你的代码,因为很多东西似乎都缺失了,这可能会导致问题。

相关问题