【问题标题】:Phonegap SQLite Error 23 Not AuthorizedPhonegap SQLite 错误 23 未授权
【发布时间】:2013-07-09 14:01:58
【问题描述】:

资源:

http://docs.phonegap.com/en/2.9.0/cordova_storage_storage.md.html#database_version

设备/框架信息:

  • Nexus 4 - Android 4.2.2
  • Phonegap 2.9.0
  • 还使用 UI 的引导库

我已按照 2.9 版的 PhoneGap 教程创建和管理数据库。到目前为止,我几乎没有发现人们在尝试写入数据库时​​谈论特定错误 23 的地方。

在 insertBtn 的 click 函数(执行 insertTemplate 函数)之后尝试写入数据库后出现此错误。

在触发 deleteBtn 事件时尝试删除行时也会发生同样的情况,该事件执行 deleteTemplate 函数。

有什么建议吗?

控制器文件:

var databaseName = "blackbriar";
var version = 1;
var displayName = "lctv";
var size = 2097152; // two megabytes
var db = null;

$(document).ready(function(event){
    // Gets shell for database
    db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
    db.transaction(populateDb, errorCb, successCb);
    db.transaction(loadTemplates, errorCb, successCb);

    $('#insertBtn').click(function(event){
        db.transaction(insertTemplate, errorCb, successCb);
    });

    $('#back').click(function(event){
        $('#templates').show();
        $('#templateEdit').hide();
        $('#back').hide();
    });
    $('#deleteBtn').click(function(event){
        db.transaction(deleteTemplate, errorCb, successCb);
        $('#back').click();
    });
});

$(document).on('click', '.pill', function(event){
    // If window width is greater than 480px, isMobile variable is false
    var isMobile = $(window).width() > 480 ? false : true;

    $('#currentId').text($(this).attr('tempid'));
    db.transaction(getTemplateById, errorCb, successCb);

    if($('#currentId').text() == "-1"){
        $('#insertBtn').show();
        $('#saveBtn').hide();
        $('#deleteBtn').hide();
        $('#clearBtn').show();
    } else {
        $('#insertBtn').hide();
        $('#saveBtn').show();
        $('#deleteBtn').show();
        $('#clearBtn').hide();
    }

    // Checks if pill is active for UI changes
    if($(this).hasClass('active')){
        $(this).removeClass('active');
        if(!isMobile){$(this).find('.temp').attr('style', 'color: black;');}
    } else {
        $('.pill').removeClass('active');
        $('.pill').find('.temp').attr('style', 'color: black;');
        $(this).addClass('active');
        if(!isMobile){$(this).find('.temp').attr('style', 'color: white;');}
    }
    if(isMobile) {
        $('#templates').hide();
        $('#templateEdit').show();
        $('#back').show();
    }
});

我的函数文件:

function getShell(databaseName, version, displayName, size) {
    return window.openDatabase(databaseName, version, displayName, size);
}

function populateDb(tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS templates (id INTEGER PRIMARY KEY AUTOINCREMENT, templateName, description, campus, account, department, programName, projectId, taskId)');
}

function errorCb(error) {
    alert("Error processing SQL: "+error.code);
}

function successCb() {
    alert("Success!");
}

function insertTemplate(tx) {

    var templateName = $('#templateName').val();
    var description = $('#descriptionField').val();
    var campus = $('#campusField').val();
    var account = $('#accountField').val();
    var department = $('#departmentField').val();
    var programName = $('#programNameField').val();
    var projectId = $('#projectIdField').val();
    var taskId = $('#taskIdField').val();

    tx.executeSql('INSERT INTO templates (templateName, description, campus, account, department, programName, projectId, taskId) VALUES ('
            +'"'+templateName+'"'+', '
            +'"'+description+'"'+', '
            +'"'+campus+'"'+', '
            +'"'+account+'"'+', '
            +'"'+department+'"'+', '
            +'"'+programName+'"'+', '
            +'"'+projectId+'"'+', '
            +'"'+taskId+'"'
            +')');
}

function loadTemplates(tx) {
    tx.executeSql('SELECT * from templates', [], templatesSuccess, errorCb);
}

function templatesSuccess(tx, results) {
    var length = results.rows.length;
    $('#templateUl').html('');
    $('#templateUl').append('<li class="templi"><a class="pill" tempid="-1"><text class="temp"><i style="color: green;" class="icon-plus"></i> Create</text></a></li>');
    for(var i = 0; i < length; i++) {
        $('#templateUl').append('<li class="templi"><a class="pill" tempid="'+results.rows.item(i).id+'"><text class="temp">'+results.rows.item(i).templateName+'</text></a></li>');
    }
}

function getTemplateById(tx) {
    var currentId = $('#currentId').text();
    tx.executeSql('SELECT * FROM templates WHERE id = '+currentId, [], loadTemplateSuccess, errorCb);
}

function loadTemplateSuccess(tx, results) {
    if(results.rows.length > 0){
        var template = results.rows.item(0);
        var templateName = $('#templateName').val(template.templateName);
        var description = $('#descriptionField').val(template.description);
        var campus = $('#campusField').val(template.campus);
        var account = $('#accountField').val(template.account);
        var department = $('#departmentField').val(template.department);
        var programName = $('#programNameField').val(template.programName);
        var projectId = $('#projectIdField').val(template.projectId);
        var taskId = $('#taskIdField').val(template.taskId);
    } else {
        var templateName = $('#templateName').val('');
        var description = $('#descriptionField').val('');
        var campus = $('#campusField').val('');
        var account = $('#accountField').val('');
        var department = $('#departmentField').val('');
        var programName = $('#programNameField').val('');
        var projectId = $('#projectIdField').val('');
        var taskId = $('#taskIdField').val('');
    }
}

function deleteTemplate(tx) {
    var currentId = $('#currentId').text();
    alert(currentId);
    tx.executeSql('DELETE FROM templates', [], templatesSuccess, errorCb);
    alert("Authorize!!!");
}

【问题讨论】:

  • 我不知道有什么建议可以解决这个问题,但看起来 PhoneGap 正在尝试使用 Android 的 WebSQL 的本机实现 - 在此处阅读您遇到的这个特定问题 - issues.apache.org/jira/browse/CB-2639
  • @Ross 它说这个问题已经解决了,它发生在 2.2 中
  • 是的,我相信它被标记为已解决,因为它无法复制。由于您使用的是最新版本的 PhoneGap,因此它似乎没有得到解决。抱歉,我并不是要说明它是否已解决,我只是想帮助您调查问题并收集一些信息来解决它。

标签: javascript android jquery sqlite cordova


【解决方案1】:

刚遇到这种情况,我不得不卸载该应用程序并重新制作(也更改了版本,但我认为没有这样做)。 关注this,所以我每次调试时都卸载该应用程序。如果您每次都必须插入项目,这可能会很烦人,但至少解决了它。

【讨论】:

  • 你能解释一下真正的原因是什么吗?我已经尝试了给定的链接,但对我不起作用,
  • 这是我的理论。事实证明,当您重新安装应用程序时,本地数据不会被清除。然后,如果您在创建数据库后清除它,它实际上不会存在,这就是它起作用的原因。问题本身是一个错误,它应该不再存在。当然,除非您尝试访问不同版本的数据库。对不起,我不知道了。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多