IOS数据库应用程序(phonegap) - 在模拟器上工作但不在设备上工作

时间:2014-01-23 10:53:32

标签: ios iphone cordova sqlite

我使用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?

1 个答案:

答案 0 :(得分:0)

已编辑/新答案:
正如the article here指出的那样,你可能不得不在XCode本身做一些工作。正如您所正确指出的那样,对于预填充数据库与运行时创建的数据库,数据库的路径是不同的。简而言之,您的修改将查找预先填充的数据库,并在检测到时将其移动到预期的位置/文件夹。好处:这将在您的代码开始执行(javascript)之前发生,因此您的现有代码将不会“意识到”这甚至发生了。

值得注意的是,我推荐你的帖子已经过去了,并将该项目从备份中排除到iCloud。您将不得不判断是否要这样做。它预先填充并不意味着您不希望备份该数据库,也不意味着它(如作者所做的那样)预先填充的数据库可能“很大”。

OLD ANSWER:
该错误似乎并不表示它对SQLite本身有困难,但是存在特定表的问题。

这通常发生在您(通过模拟器)进行测试时,并在某个时刻点击执行表的CREATE语句的相应代码。然后,稍后,您习惯于该表存在并意外断开模式检查或表存在检查代码。由于表已经存在,因此您的模拟器将继续执行,并且永远不会尝试重新创建该表。但是,当您在实际设备上运行它时,CREATE代码永远不会执行并进入您希望表存在的区域 - 这会导致错误。

由于你还没有发布任何代码,这对我来说都是猜想。如果你想让我看看,我会很高兴。