Phonegap中的持久存储

时间:2013-05-02 20:32:42

标签: javascript android cordova local-storage

我花了最后6个小时尝试使用phonegap来保存数据,我的第一种方法是使用localStorate API但是每次重新启动应用程序时都会被杀死,所以它没用。现在我通过将文件写入文件系统来实现它,但存在以下问题:

  • 文件已创建好
  • 该文件的内容正在
    adb pull /data/data/[package name]/friends.txt)
    我可以看到文件的内容
  • 但是尝试从中读取我总是得到NULL。

这是我的代码,如果有人可以帮助我...我现在没有想法:(

var friends = [];

// Initialize the Facebook SDK
document.addEventListener('deviceready', function() {
  FB.init({
      appId: '[myAppID]',
      nativeInterface: CDV.FB,
      useCachedDialogs: false
  });

  // Check if we already fetched our friends
  readSavedContent();

});

 function readSavedContent() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFileSystemForRead, fail);
 }

 function gotFileSystemForRead(fileSystem) {
     fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntryForRead, fail);
 }

 function gotFileSystemForWrite(fileSystem) {
     fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntryForWrite, fail);
 }

  function gotFileEntryForRead(fileEntry) {
      var reader = new FileReader();
          reader.onloadend = function(evt) {
              alert("Data stored is " + evt.target.result);
          };
          reader.readAsText(fileEntry);
  }

 function gotFileEntryForWrite(fileEntry) {
     fileEntry.createWriter(gotFileWriter, fail);
 }

 function gotFileWriter(writer) {
     writer.onwriteend = function(evt) {
        // show a message
        alert(friends.length + " friends fetched, you should be able to see them if you restart the app");
     };
     writer.write(JSON.stringify(friends));
 }

 function fail(error) {
     console.log(error.code);
     alert(error);
 }

 function login() {
     FB.login(function (response) {
        console.log(JSON.stringify(response));

         if (response.status === "connected") {
             alert("logged in: fetching friends now");

             // Fetch my friends
             FB.api("/fql?q=" + encodeURIComponent('SELECT uid, first_name, last_name, email, pic, pic_big, is_app_user, devices FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1= me()) ORDER BY first_name LIMIT 2000'),
                 function(response) {
                     friends = response.data;
                     // Store the data to the disk                  
                     window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFileSystemForWrite, fail);
                 }
             );

         } else {
             alert('not logged in');
         }
     }, {
         scope: "email"
     });
 }

// Initialize the Facebook SDK document.addEventListener('deviceready', function() { FB.init({ appId: '[myAppID]', nativeInterface: CDV.FB, useCachedDialogs: false }); // Check if we already fetched our friends readSavedContent(); }); function readSavedContent() { window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFileSystemForRead, fail); } function gotFileSystemForRead(fileSystem) { fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntryForRead, fail); } function gotFileSystemForWrite(fileSystem) { fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntryForWrite, fail); } function gotFileEntryForRead(fileEntry) { var reader = new FileReader(); reader.onloadend = function(evt) { alert("Data stored is " + evt.target.result); }; reader.readAsText(fileEntry); } function gotFileEntryForWrite(fileEntry) { fileEntry.createWriter(gotFileWriter, fail); } function gotFileWriter(writer) { writer.onwriteend = function(evt) { // show a message alert(friends.length + " friends fetched, you should be able to see them if you restart the app"); }; writer.write(JSON.stringify(friends)); } function fail(error) { console.log(error.code); alert(error); } function login() { FB.login(function (response) { console.log(JSON.stringify(response)); if (response.status === "connected") { alert("logged in: fetching friends now"); // Fetch my friends FB.api("/fql?q=" + encodeURIComponent('SELECT uid, first_name, last_name, email, pic, pic_big, is_app_user, devices FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1= me()) ORDER BY first_name LIMIT 2000'), function(response) { friends = response.data; // Store the data to the disk window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFileSystemForWrite, fail); } ); } else { alert('not logged in'); } }, { scope: "email" }); }

2 个答案:

答案 0 :(得分:2)

从我可以看到你在文件读取操作过程中忘记了一步。

在您的情况下,您有此订单:

 function gotFileSystemForRead(fileSystem) {
     fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntryForRead, fail);
 }

 function gotFileEntryForRead(fileEntry) {
     var reader = new FileReader();
     reader.onloadend = function(evt) {
         alert("Data stored is " + evt.target.result);
     };
     reader.readAsText(fileEntry);
 }

什么时候看起来像这样:

function gotFileSystemForRead(fileSystem) {
    fileSystem.root.getFile("friends.txt", {create: true, exclusive: false}, gotFileEntry, fail);
}

function gotFileEntry(fileEntry) {
    fileEntry.file(gotFileEntryForRead, fail);
}

function gotFileEntryForRead(file) {
    var reader = new FileReader();
    reader.onloadend = function(evt) {
        alert("Data stored is " + evt.target.result);
    };
    reader.readAsText(file);
}

要了解更多内容,请查看此官方Phonegape FileReader文档。

然后,您可以随时放弃此解决方案,并使用 persistance js 进行数据存储。它将为您提供4 + 1个不同的文件/数据存储选项,并且可在多种平台上运行。

答案 1 :(得分:2)

作为旁注,本地存储持久性在cordova(phonegap)2.6版本中被窃听,所以如果是这种情况,请尝试迁移到最近发布的cordova 2.7或降级到2.5以消除所述错误。