On Wednesday, October 30, 2013 7:44:17 PM UTC+2, Nobu Games wrote:
>
> I quickly peeked into the source code and well, this is the way how it is 
> programmed. When an exception occurs while the preferences data file gets 
> read, SharedPreferences sets internally an empty map so you start from 
> scratch. I even dug a bit deeper. The XML serializer just ignores NULL keys 
> and creates XML output that cannot be properly read anymore through the map 
> deserialization method which seems to expect an existing key value.
>
 
My question is really why was it allowed to insert a null key in the first 
place - why not throw a NPE immediately (and say so in the docs) ?
If you read my links (point 3 
here<http://stackoverflow.com/questions/19610569/android-sharedpreferences-null-keys-values-and-sets-corner-cases>)
 
you will see that null keys are perfectly valid :  - they fail only on 
loading the prefs - taking down everything with them
They should either fix deserialization or prohibit null keys 

>
> As for why it has been programmed like that... I think the reasoning may 
> be that preferences are not deemed to be of so much importance that it 
> should make the app crash in case of failure. This error state is silently 
> discarded and you start over with the defaults. I think that's a reasonable 
> approach since any app should be able to start over with empty preferences.
>
 

Not* at all* - Shared Preferences is a 
documented<http://developer.android.com/guide/topics/data/data-storage.html#pref>persistence
 mechanism - it is as reasonable as deleting a database without 
even saying so
 

>
> In this particular case you may have discovered a tiny bug you may want to 
> report. But to be honest, using null keys is a pretty unusual thing to do.
>

Not so (either by mistake or not). 
See the discussions in the SO. Some more I suspect they *may *have to do 
with null keys :

sharedpreferences - Android - Shared Preferences are lost sometimes - Stack 
Overflow
http://stackoverflow.com/questions/7943573/android-shared-preferences-are-lost-sometimes
android - Shared Preferences get lost after shutting down device or killing 
the app - Stack Overflow
http://stackoverflow.com/questions/9803838/shared-preferences-get-lost-after-shutting-down-device-or-killing-the-app#comment12495021_9803838
 

>
> On Wednesday, October 30, 2013 5:48:12 AM UTC-5, Palmer Eldritch wrote:
>>
>> The preferences are apparently *cleared *when one tries to load them 
>> when there is a null key which is bad ! Reproducer :
>>
>>     public class XmlExceptionTest extends AndroidTestCase {
>>         /** Run it twice - on the second run the exception is thrown */
>>         public void testXmlException() {
>>             Context ctx = getContext();
>>             SharedPreferences prefs = PreferenceManager
>>                 .getDefaultSharedPreferences(ctx); // exception thrown 
>> here (line 18)
>>             // and apparently it clears the prefs as the condition below 
>> is false
>>             if (prefs.contains("run_once")) { // false
>>                 Log.w("XmlExceptionTest",
>>                     "contains null key :" + prefs.contains(null));
>>             }
>>             Editor e = prefs.edit();
>>             e.putBoolean("run_once", true).commit();
>>             e.putString(null, "I put a sting with null key").commit();
>>             assertTrue("Contains null", prefs.contains(null));
>>             PreferenceManager.getDefaultSharedPreferences(ctx); // 
>> exception
>>             // NOT thrown here  - why ? - apparently there is a static 
>> factory
>>             // returning the instance it already constructed
>>             // e.clear().commit(); // this eliminates the exception
>>         }
>>     }
>>     
>> exception :
>>
>>     W/ApplicationContext(): getSharedPreferences
>>     W/ApplicationContext(): org.xmlpull.v1.XmlPullParserException: Map 
>> value without name attribute: string
>>     W/ApplicationContext():     at 
>> com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:521)
>>     W/ApplicationContext():     at 
>> com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:733)
>>     W/ApplicationContext():     at 
>> com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:667)
>>     W/ApplicationContext():     at 
>> com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:470)
>>     W/ApplicationContext():     at 
>> android.app.ContextImpl.getSharedPreferences(ContextImpl.java:361)
>>     W/ApplicationContext():     at 
>> android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:348)
>>     W/ApplicationContext():     at 
>> gr.uoa.di.android.helpers.test.XmlExceptionTest.testXmlException(XmlExceptionTest.java:18)
>>     W/ApplicationContext():     at 
>> java.lang.reflect.Method.invokeNative(Native Method)
>>     W/ApplicationContext():     at 
>> java.lang.reflect.Method.invoke(Method.java:521)
>>     W/ApplicationContext():     at 
>> junit.framework.TestCase.runTest(TestCase.java:154)
>>     W/ApplicationContext():     at 
>> junit.framework.TestCase.runBare(TestCase.java:127)
>>     W/ApplicationContext():     at 
>> junit.framework.TestResult$1.protect(TestResult.java:106)
>>     W/ApplicationContext():     at 
>> junit.framework.TestResult.runProtected(TestResult.java:124)
>>     W/ApplicationContext():     at 
>> junit.framework.TestResult.run(TestResult.java:109)
>>     W/ApplicationContext():     at 
>> junit.framework.TestCase.run(TestCase.java:118)
>>     W/ApplicationContext():     at 
>> android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
>>     W/ApplicationContext():     at 
>> android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
>>     W/ApplicationContext():     at 
>> android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
>>     W/ApplicationContext():     at 
>> android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
>>
>> Posted in SO 
>> here<http://stackoverflow.com/questions/19610569/android-sharedpreferences-null-keys-values-and-sets-corner-cases>and
>>  in the relevant thread 
>> here <http://stackoverflow.com/a/19621603/281545> - but still no answers
>>
>> Any ideas ?
>>
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to