再次保存,清除和保存SharedPreferences

时间:2013-04-20 16:50:05

标签: android sharedpreferences

在我的应用程序中,一个活动包含厨房,可以在SD卡创建的文件夹(saved_images)中按顺序存储所有图像,每个东西都运行正常,以便删除此文件夹( saved_images)由于任何原因,然后再次打开应用程序并保存任何图像,应用程序将再次创建(saved_images)文件夹,但保存的图像编号仍然记住SharedPreferences值并存储图像继续编号。以前保存的已删除旧文件夹的图像,我的目标是获得以下内容:

1 - 一次(saved_images)文件夹从SD卡中删除自动SharedPreferences必须清除,如果再次创建(saved_images)文件夹,则会从头开始存储图像,即image-1,image-2,等等。

我尝试使用此代码清除SharedPreferences但它不起作用可能导致存储一个仅称为image-1的图像。

2 - 如果我一次保存两次相同的图像,但我只需要保存一次,当我再次尝试保存它时必须给Toast:已经保存。

这是我用来清除和恢复SharedPreferences的代码片段:

   View vi=convertView; 
    final ViewHolder holder; 
    if(convertView==null){ 
        vi = inflater.inflate(R.layout.gallery_items, null); 
        holder=new ViewHolder(); 
        holder.text=(TextView)vi.findViewById(R.id.textView1); 
        holder.image=(ImageView)vi.findViewById(R.id.image); 
        holder.button=(Button)vi.findViewById(R.id.button_save);

        holder.button.setOnClickListener(new OnClickListener() {

  private Bitmap bm;
public void onClick(View arg0) {
    String root = Environment.getExternalStorageDirectory().toString();
       File myDir = new File(root + "/saved_images");
       if(!myDir.exists()){
           myDir.mkdirs();
    bm = BitmapFactory.decodeResource( mContext.getResources(), images[itemPos]);
         holder.image.setImageBitmap(bm);
 SharedPreferences savedNumber = mContext.getSharedPreferences(PREFS_NAME, 0); 
        int lastSavedNumber = savedNumber.getInt("lastsavednumber",0); 
        lastSavedNumber++; 
        String fname = "Image-"+lastSavedNumber+".png"; 

        File file = new File (myDir, fname); 
        if (file.exists ()) {file.delete (); } 
        try { 
        FileOutputStream out = new FileOutputStream(file); 
             bm.compress(Bitmap.CompressFormat.PNG, 100, out);
        out.flush(); 
        out.close(); }
         catch (Exception e) { 
        e.printStackTrace(); }

        SharedPreferences saveNumber = mContext.getApplicationContext
                  ().getSharedPreferences(PREFS_NAME, 0); 
        SharedPreferences.Editor editorset = saveNumber.edit(); 
        editorset.putInt("lastsavednumber",lastSavedNumber); 
        editorset.commit();}

  else if(!myDir.delete()){
    SharedPreferences saveNumber1 = mContext.getApplicationContext
         ().getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editor = saveNumber1.edit();
    editor.clear(); 
    editor.commit();

Toast.makeText(mContext, "saved", Toast.LENGTH_SHORT). show();}}});
      vi.setTag(holder);}

    else holder=(ViewHolder)vi.getTag(); 
    holder.text.setText(name[itemPos]); 

    final int stub_id=images[itemPos]; 
    holder.image.setImageResource(stub_id); 

    return vi; } 

这是原始代码,可以正常工作并按顺序存储所有图像

在SD卡文件夹中。

   View vi=convertView; 
    final ViewHolder holder; 
    if(convertView==null){ 
        vi = inflater.inflate(R.layout.gallery_items, null); 
        holder=new ViewHolder(); 
        holder.text=(TextView)vi.findViewById(R.id.textView1); 
        holder.image=(ImageView)vi.findViewById(R.id.image); 
        holder.button=(Button)vi.findViewById(R.id.button_save);

        holder.button.setOnClickListener(new OnClickListener() {

  private Bitmap bm;
  private String PREFS_NAME;
public void onClick(View arg0) {
       String root = Environment.getExternalStorageDirectory().toString();
       File myDir = new File(root + "/saved_images");
       if(!myDir.exists()){
           myDir.mkdirs();}
   bm = BitmapFactory.decodeResource( mContext.getResources(), images[itemPos]);
         holder.image.setImageBitmap(bm);
 SharedPreferences savedNumber = mContext.getSharedPreferences(PREFS_NAME, 0); 
        int lastSavedNumber = savedNumber.getInt("lastsavednumber",0); 
        lastSavedNumber++; 
        String fname = "Image-"+lastSavedNumber+".png"; 

        File file = new File (myDir, fname); 
        if (file.exists ()) {file.delete (); } 
        try { 
        FileOutputStream out = new FileOutputStream(file); 
        bm.compress(Bitmap.CompressFormat.PNG, 100, out); 
        out.flush(); 
        out.close(); }
         catch (Exception e) { 
        e.printStackTrace(); 
        } 

    SharedPreferences saveNumber = mContext.getApplicationContext 
                 ().getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editorset = saveNumber.edit(); 
    editorset.putInt("lastsavednumber",lastSavedNumber); 
    editorset.commit();
  Toast.makeText(mContext, "saved", Toast.LENGTH_SHORT). show();}});

      vi.setTag(holder);}

    else holder=(ViewHolder)vi.getTag(); 
    holder.text.setText(name[itemPos]); 

    final int stub_id=images[itemPos]; 
    holder.image.setImageResource(stub_id); 

    return vi; } 

我知道有些东西缺失或以错误的方式应用,所以请任何帮助,我们将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:1)

问题1

删除文件夹时,必须将SharedPreferences值设置为零。因此它可以与您当前的代码一起使用,就像您预期的那样

if(!myDir.exists()){ 
myDir.mkdirs();
SharedPreferences saveNumber = mContext.getApplicationContext().getSharedPreferences(PREFS_NAME, 0); 
SharedPreferences.Editor editorset = saveNumber.edit(); 
editorset.putInt("lastsavednumber",0); 
editorset.commit();
}

问题2 为包含已保存/未保存状态的图像的所有详细信息创建数据库。

不是将值存储在数组中,而是必须将其存储到数据库中。

在将图像保存到SD卡之前,您必须检查数据库已保存/未保存状态。如果未保存,则可以保存图像,并且还必须更新仅为该图像保存的数据库列状态。因此,下次当用户按下相同的图像时,您会发现图像已保存。您可以Toast在图片已保存的位置。

答案 1 :(得分:0)

在您的原始代码中,您可以

...
int lastSavedNumber = savedNumber.getInt("lastsavednumber",0);
...
if(!myDir.exists())
{
       myDir.mkdirs();
       lastSavedNumber = 0; // reset counter
}
...