0

私は、Android* デバイス用のこの PhoneGap (cordova-2.0.0.js) コードを作成して、一部のデータを永続化しました。この奇妙なエラー コードが表示され、ファイルが書き込まれていないようです。サンプル コードから始めて、インライン文字列をファイル ハンドルに正常に書き込むことができたので、パーミッションとすべてが正しいと確信しています。

おそらく、すべてのコールバックを正しく処理していないのでしょうか? 聞きどころ満載です!truncate(0); を使用したものである可能性があります。それに関する多くのドキュメントを見つけるのに苦労しました。window.requestFileSystem を複数回呼び出す必要がありますか? 異なるコールバックを登録するために 2 回実行します。そうでない場合、エラーの原因は何ですか?

読み取り + 書き込み操作の合計行数を減らすための提案も喜んで受け入れられます...

*Android 2.3.4 を実行するエミュレーター

ここに私のコードがあります:

var CREDENTIALS_FILE_NAME = "credentials.json";
var credentials;

// INIT -- Wait for PhoneGap to load
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, initCredentialReader, fail);
}
function initCredentialReader(fileSystem) {
    fileSystem.root.getFile(CREDENTIALS_FILE_NAME, {create: true}, gotFileEntryReader, fail); 
}
function gotFileEntryReader(fileEntry) {
    fileEntry.file(gotFileToRead, fail);
}
function gotFileToRead(file){
    var reader = new FileReader();
    reader.onloadend = function(e) {
        console.log("--FILE READER: "+e.target.result);

        if( e.target.result.length < 1 ) {
            credentials = newCredentials();
        } else {
            credentials = JSON.parse( e.target.result );
        }
    };
    reader.readAsText(file);
}
// END CHAIN

function initCredentialWriter(fileSystem) {
    fileSystem.root.getFile(CREDENTIALS_FILE_NAME, {create: true}, gotFileEntryWriter, fail); 
}
function gotFileEntryWriter(fileEntry) {
    fileEntry.createWriter(gotFileWriter, fail);
}
function gotFileWriter(writer) {
    writer.onwrite = function(e) {
        console.log("--- write success");
    };
    var toWrite = JSON.stringify(credentials);
    console.log("--- toWrite: "+toWrite);
    writer.truncate(0);
    writer.seek(0);
    writer.write(toWrite);
}


function fail(error) {
    console.log("--- write FAIL: "+error.code);
}

function newCredentials() {
    console.log("returning newCredentials!");
    return {
        "username" : "",
        "password" : "",
        "organization" : "",
        "cookieValue" : "" };
}

function getCredentials() {
    console.log("--- getCredentials: "+credentials);
    return credentials;
}

function saveCredentials( jsonCredentials ) {
    console.log('--- saveCredentials jsonCredentials: '+ jsonCredentials);

    credentials = JSON.stringify( jsonCredentials );
    console.log('--- credentials to save: '+credentials)

    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, initCredentialWriter, fail);
    return credentials;
} 

エラー

08-14 18:41:38.839: I/Web コンソール (2678): 成功コールバックのエラー: File9 = {"code":7,"line":2863,"expressionBeginOffset":91407,"expressionEndOffset":91455," sourceId":4122528,"sourceURL":"file:///android_asset/www/cordova-2.0.0.js"} at file:///android_asset/www/cordova-2.0.0.js:258

4

1 に答える 1

1

したがって、truncate() と write() の呼び出しは非同期的に正しくないことがわかります。次のように、より多くのコールバックを実装しただけです。

function initCredentialTruncate(fileSystem) {
    fileSystem.root.getFile(CREDENTIALS_FILE_NAME, {create: true}, gotFileEntryTruncate, fail); 
}
function gotFileEntryTruncate(fileEntry) {
    fileEntry.createWriter(gotFileTruncate, fail);
}
function gotFileTruncate(writer) {
    writer.onwrite = function(e) {
        console.log("--- truncate success");
    };
    writer.truncate(0);
    //writer.seek(0);
}
// END CHAIN

必要に応じて init 関数を呼び出します。ベントさせてくれてthx、StackOverflow ...

于 2012-08-16T05:43:31.880 に答える