web-dev-qa-db-ja.com

IphonelocalStorage「QUOTA_EXCEEDED_ERR」の問題

HTML5(localStorage)で利用可能なクライアント側ストレージをiPhoneアプリケーションに使用しようとしていますが、localStorage(whichに関連付けられている "[〜#〜] quote [〜#〜]"を完全に認識しています。現在5MB)です。

今、問題は私のアプリケーション(以前にデータが保存されていない)にあります。データをlocalStorageに保存しようとすると、結果としてQUOTA_EXCEEDED_ERRになりますが、データ全体のサイズは5 MB未満です(正確には〜4Kb(chrome通常のブラウザのWebインスペクタ))

データの重さが4Kbの場合、同じ上限が5MBの場合、QUOTA_EXCEEDED_ERRになるということを誰かが共有できますか?

問題はiPhoneでのみ発生すべてのブラウザであり、iPhone SimulatorでもQUOTA_EXCEEDED_ERRエラーが表示されないことに注意してください

iPhoneは現在iPhone4です。

20
Viren

[設定]-> [Safari]に移動し、プライベートブラウジングがオンになっているかどうかを確認します。そうである場合、ローカルストレージは何も保存できません。ローカルストレージをチェックするための基本的なコードは次のとおりです。

_if (!!window.localStorage) 
{
    localStorage.setItem(key, val);
};
_

また、どのように設定していますか? localStorage.setItem(key, val)を使用していますか、それともlocalStorage(key, val)を試していますか?間違った設定が原因で問題が発生している可能性があります

28
JoeCortopassi

同じ問題が発生しましたが、JoeCortopassiは部分的にしか正しくありません。これは、プライベートブラウジングが有効になっていることが原因です。ただし、その回答で提供されているコードはあまり役に立ちません。 iPad Safari(ios5)でテストしたところ、

console.log(!!window.localStorage); // true

値を設定しようとするとすぐに、例外が発生します。

localStorage.setItem("test", "test") // Exception 22 is thrown

したがって、ローカルストレージのサポートを正確にテストするには、ローカルストレージに値を設定してみる必要があります。次に例を示します。

var localStorageSupported = function() {
  try {
    localStorage.setItem("test", "test");
    localStorage.removeItem("test");
    return true;
  } catch(e){
    return false;
  }
}
19
wosis

実際のところ、Safari for iOS <6でプライベートブラウジングモードを使用しても、window.localStoragewindow.sessionStorageは空になりません。したがって、!!window.localStorageまたは!!window.sessionStorageをチェックするだけでは不十分です。これらのコンポーネントから呼び出すと失敗し、これがスローされますQUOTA_EXCEEDED_ERRエラー。

これらのプラットフォームでは、プライベートモードでクォータがゼロに設定されているようです。これが、Modernizrと同じように、これらの機能を実際にテストするために、try ... catchステートメントでラップする必要がある理由です。

Modernizrコード:

var mod = 'modernizr';
/*...*/
tests['localstorage'] = function() {
    try {
        localStorage.setItem(mod, mod);
        localStorage.removeItem(mod);
        return true;
    } catch(e) {
        return false;
    }
};

Web APIを信頼する必要がありますが、慎重に行ってください。

8
lib3d

新しい値を設定する前に、値を削除してみてください。

localStorage.removeItem(key);
localStorage.setItem(key, val);

似ているので、 この質問 も参照してください。

3

ローカルストレージの割り当てはドメインに関連付けられています。データストレージを使用する他のページがある場合、それらがいっぱいになる可能性があります。キーを繰り返して、例外が発生したときにストレージに何があるかを調べます。

try {
   // try to insert storage here
} catch ( err ) {
   for ( var i =0; i < storage.length ; i++ ) {
       console.log ( storage.key( i ) )
    }
}
3
Teemu Ikonen