我使用phonegap构建了一个iphone应用程序。我正在使用sqlite3 db在本地存储数据。该应用程序在模拟器上完美运行但在实际的ios设备上出错。抛出“Could not prepare statement (1 no such table: table_name)
”错误代码同样是Code = 5.
我是否必须在ios设备上安装sqlite插件?该应用程序正处于测试阶段。我按照this中提供的步骤在ios设备上安装应用程序。
我在这里缺少什么?
更新: 这是我正在使用的一段代码。我的数据库位于
位置/ Users / imac / Library / Application Support / iPhone Simulator / 7.0.3 / Applications / 4C7CC11A-8938-479F-B810-86121D3311B7 / Library / WebKit / Local Storage / File_0
在设备上它位于
AppData / Library / WebKit / Local Storage / File_0
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<title>Books | Categories</title>
<link href="css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="css/style.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf-8" src="js/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8">
var db;
var shortName = 'Books';
var version = '1.0';
var displayName = 'BooksDB';
var maxSize = 200000;
function errorHandler(transaction, error) {
alert('Error: ' + error.message + ' code: ' + error.code);
}
function successCallBack() {
alert("DEBUGGING: success");
}
function nullHandler(){
alert('null handler');
};
function onBodyLoad(){
if (!window.openDatabase) {
alert('Databases are not supported in this browser.');
return;
}
db = window.openDatabase(shortName, version, displayName, maxSize);
alert('db open');
ListDBValues();
}
function ListDBValues() {
var ArrayAlphabet=new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
$('.container').empty();
for (var i = 0; i < ArrayAlphabet.length; i++) {
data='<div class="order" id="'+ArrayAlphabet[i]+'"></div>';
load_books(ArrayAlphabet[i]);
$('.container').append(data);
data="";
}
return;
}
function load_books(bookTitleAlphabet)
{
if (!window.openDatabase) {
alert('Databases are not supported in this browser.');
return;
}
db.transaction(function(transaction) {
transaction.executeSql('SELECT * FROM books where book_title like "'+bookTitleAlphabet+'%" order by book_title desc;', [],
function(transaction, result) {if (result != null && result.rows != null) {
$('#'+bookTitleAlphabet).html(bookTitleAlphabet);
for (var i = 0; i < result.rows.length; i++) {
var data;
var row = result.rows.item(i);
data="<a href='details.html?id="+row.book_id+"'> <div class='book'>";
data +="<div class='book_img'><img src="+row.book_thumb_location+"></div>";
data +="<div class='book_detail'>";
data +="<div class='title'>"+row.book_title+"</div>";
data +="<div class='author'>"+row.book_author+"</div>";
data +="</div>";
data +="<div class='clear'>";
data +="</div>";
data +="</div>";
data +="</a>";
var tempId='#'+bookTitleAlphabet;
$(tempId).append(data);
tempId="";
}}
if (result.rows.length==0)
{
var tempId='#'+bookTitleAlphabet;
$(tempId).hide();
}
},errorHandler);},errorHandler,nullHandler);
return;
}
</script>
</head>
<body onload="onBodyLoad()">
<div id="wrapper">
<div class="overflow_hide">
</div>
<div class="menu">
<div class="header">
<div class="back">
<a href="index.html">
<input class="gobutton" type="button" value="Back" ></a>
</div>
<div class="list_book">BOOKS
</div>
<div class="settings">
<a href="index.html">
<input class="gobutton" type="button" value="Home" ></a>
</div>
</div>
<div class="container">
<div class="clear">
</div>
</div>
</div>
<div class="opac">
<a href="about.html">
<div class="opac1">About Us
</div></a>
<a href="search.html">
<div class="opac1">Search
</div></a>
</div>
<div class="clear">
</div>
</div>
</body>
</html>
这是因为app无法找到db?
答案 0 :(得分:0)
已编辑/新答案:
正如the article here指出的那样,你可能不得不在XCode本身做一些工作。正如您所正确指出的那样,对于预填充数据库与运行时创建的数据库,数据库的路径是不同的。简而言之,您的修改将查找预先填充的数据库,并在检测到时将其移动到预期的位置/文件夹。好处:这将在您的代码开始执行(javascript)之前发生,因此您的现有代码将不会“意识到”这甚至发生了。
值得注意的是,我推荐你的帖子已经过去了,并将该项目从备份中排除到iCloud。您将不得不判断是否要这样做。它预先填充并不意味着您不希望备份该数据库,也不意味着它(如作者所做的那样)预先填充的数据库可能“很大”。
OLD ANSWER:
该错误似乎并不表示它对SQLite本身有困难,但是存在特定表的问题。
这通常发生在您(通过模拟器)进行测试时,并在某个时刻点击执行表的CREATE语句的相应代码。然后,稍后,您习惯于该表存在并意外断开模式检查或表存在检查代码。由于表已经存在,因此您的模拟器将继续执行,并且永远不会尝试重新创建该表。但是,当您在实际设备上运行它时,CREATE代码永远不会执行并进入您希望表存在的区域 - 这会导致错误。
由于你还没有发布任何代码,这对我来说都是猜想。如果你想让我看看,我会很高兴。