androidqq6
androidqq6

Reputation: 1526

Save , Clear and Save SharedPreferences again

In my app , one activity contain galley which enable store all the images in sequential order in SD card created folder called ( saved_images ) , every thing run fine , BUT in case of delete this folder ( saved_images ) for any reason , then open app again and save any image , app will create the ( saved_images ) folder again but saved image number still remember the SharedPreferences value and store images in continued no. of previous saved images of deleted old folder , my goal to get the following:

1- once ( saved_images ) folder deleted from SD card Automatically SharedPreferences must be cleard and if ( saved_images ) folder created again it store images from the beginning which mean image-1,image-2,and so on .

i tried with this code to clear the SharedPreferences but it doesnt work probably it lead to store one image only called image-1 only .

2- if i save the same image twice a time it saved , but i need to save it once a time only and when try to save it again must give Toast : already saved .

this is the piece of code which i used to clear and restore the 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; } 

and this the original code which work fine and store all the images in sequential order

in SD card folder .

   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; } 

i know ther is some thing missing or applied in wrong way , so please any help regard it will be appreciated , thanks.

Upvotes: 0

Views: 369

Answers (2)

vinothp
vinothp

Reputation: 10069

For Question 1

While deleting your folder you have to set the your SharedPreferences Value to be zero. So it will work with your current code and as like you expected

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

For Question 2 Create a database to all the details about the image including saved/unsaved state.

Instead of storing values in array you have to store that in to database.

Before saving the image in to sdcard, you have to check with the database saved/unsaved state. If not saved then you can save the image and also you have to update the database column state as saved for that image only. So next time when the user presses the same image you can find that the image is saved. Where you can Toast as Image already saved.

Upvotes: 1

jhole
jhole

Reputation: 4236

In your original code you could just

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

Upvotes: 0

Related Questions