【问题标题】:SQLite database in Javascript locally本地 Javascript 中的 SQLite 数据库
【发布时间】:2011-07-11 19:06:50
【问题描述】:

我在 XCode 上使用 PhoneGap 项目。 我正在尝试使用 Javascript 连接到 SQLite 数据库。

我在 SQLite 工具中创建了一个文件“myDatabase.sqlite”。现在我的问题是如何在我的代码中打开该数据库?现在我正在使用以下代码:

var db; 
var shortName = 'myDatabase'; 
var version = '1.0'; 
var displayName = 'myDatabase'; 
var maxSize = 65535; 


db = openDatabase(shortName, version, displayName,maxSize); 

db.transaction(function(transaction) {
    transaction.executeSql('SELECT * FROM User;', [],
    function(transaction, result) {

        if (result != null && result.rows != null) {
            for (var i = 0; i < result.rows.length; i++) {
                var row = result.rows.item(i);
                alert(row.ID);
            }
        }
    }, errorHandler);
}, errorHandler, nullHandler);

问题是数据库是空的,因为当我运行它时,它会给出错误“没有这样的表”。 我认为它创建了一个名为“myDatabase”的新数据库,这就是它没有表的原因。

有人知道如何打开包含所有表格的文件吗?

谢谢!

【问题讨论】:

    标签: javascript sqlite connection cordova local


    【解决方案1】:

    这个脚本会帮助你:

    <script type="text/javascript">
          function createDatabase(){
             try{
                  if(window.openDatabase){
                  var shortName = 'db_xyz';
                  var version = '1.0';
                  var displayName = 'Display Information';
                  var maxSize = 65536; // in bytes
                  db = openDatabase(shortName, version, displayName, maxSize);
            }
         }catch(e){
                     alert(e);
               }
         }
         function executeQuery($query,callback){
         try{
             if(window.openDatabase){
             db.transaction(
             function(tx){
             tx.executeSql($query,[],function(tx,result){
             if(typeof(callback) == "function"){
                     callback(result);
             }else{
                     if(callback != undefined){
                           eval(callback+"(result)");
                      }
             }
             },function(tx,error){});
              });
               return rslt;
             }
             }catch(e){}
             }
               function createTable(){
               var sql = 'drop table image';
                     executeQuery(sql);
                     var sqlC = 'CREATE TABLE image (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, image BLOB )';
                     executeQuery(sqlC);
               }
               function insertValue(){
                    var img = document.getElementById('image');
                    var sql = 'insert into image (name,image) VALUES ("sujeet","'+img+'")';
                    executeQuery(sql,function(results){alert(results)});
                }
    <input type="button" name='create' onClick="createDatabase()" value='Create Database'>
    <input type="button" name='create' onClick="createTable()" value='create table'>
    <input type="button" name='insert' onClick="insertValue()" value='Insert value'>
    <input type="button" name='select' onClick="showTable()" value='show table'>
    <input type="file" id="image" >
    <div result></div>
    </script>
    

    要下载代码,请访问网址:

    http://blog.developeronhire.com/create-sqlite-table-insert-into-sqlite-table/

    【讨论】:

    • 这段代码删除了包含您已经在 sqlite 文件中创建的数据的表?所以还是要在代码中再次插入数据?我需要的所有数据都已经在 SQLite 文件中了..
    • 您提供的链接已失效,您能更新一下吗?谢谢
    • 我尝试使用此代码。我正在使用 cordova 将其构建为 iPhone 中的应用程序。但我得到 err.code 5。你能帮帮我吗? @Sujeet
    【解决方案2】:

    myDatabase 和 myDatabase.sqlite 是 2 个不同的文件名,请更新您的代码以引用正确的文件名和扩展名。

    如果您尝试打开一个不存在的数据库,SQLite 会自动创建一个新的空数据库。

    【讨论】:

    • 当我使用名称 myDatabase.sqlite 时,程序会在 openDatabase 命令处停止(我在该行之前和之后都放置了一个警报......它显示了第一个警报,但没有显示第二个。所以这就是为什么我认为这是问题......有什么想法吗?
    【解决方案3】:

    在我的 sqlite 代码中,我使用三个 js 文件来控制 sqlite,一个用于调试目的,一个用于执行查询,另一个用于初始化数据库和创建基本表。

    debug.js
    启动.js
    查询.js

    Reference URL ishttp://allinworld99.blogspot.in/2016/04/sqlite-first-setup.html
    启动.js

    var CreateTb1 = "CREATE TABLE IF NOT EXISTS tbl1(ID INTEGER PRIMARY KEY AUTOINCREMENT, CreatedDate TEXT,LastModifiedDate TEXT, Name TEXT)";
    var CreateTb2 = "CREATE TABLE IF NOT EXISTS tbl2(ID INTEGER PRIMARY KEY AUTOINCREMENT, CreatedDate TEXT,LastModifiedDate TEXT,Mark INTEGER)";
    
    var DefaultInsert = "INSERT INTO tbl1(CreatedDate,Name) select '" + new Date() + "','Merbin Joe'  WHERE NOT EXISTS(select * from tbl1)";
    
    var db = openDatabase("TestDB", "1.0", "Testing Purpose", 200000); // Open SQLite Database
    
    $(window).load(function()
    {
      initDatabase();
    });
    
    function createTable() // Function for Create Table in SQLite.
    {
    
      db.transaction(function(tx)
      {
        tx.executeSql(CreateTb1, [], tblonsucc, tblonError);
        tx.executeSql(CreateTb2, [], tblonsucc, tblonError);
    
        insertquery(DefaultSettingInsert, defaultsuccess);
    
      }, tranonError, tranonSucc);
    }
    
    function initDatabase() // Function Call When Page is ready.
    {
      try
      {
        if (!window.openDatabase) // Check browser is supported SQLite or not.
        {
          alert('Databases are not supported in your device');
        }
        else
        {
          createTable(); // If supported then call Function for create table in SQLite
        }
      }
      catch (e)
      {
        if (e == 2)
        {
          // Version number mismatch.
          console.log("Invalid database version.");
        }
        else
        {
          console.log("Unknown error " + e + ".");
        }
        return;
      }
    }
    

    debug.js

    function tblonsucc()
    {
      console.info("Your table created successfully");
    }
    
    function tblonError()
    {
      console.error("Error while creating the tables");
    }
    
    function tranonError(err)
    {
      console.error("Error processing SQL: " + err.code);
    }
    
    function tranonSucc()
    {
      console.info("Transaction Success");
    }
    

    query.js

    function insertquery(query, succ_fun)
    {
      db.transaction(function(tx)
      {
        tx.executeSql(query, [], eval(succ_fun), insertonError);
      });
    }
    
    function deletedata(query, succ_fun)
    {
      db.transaction(function(tx)
      {
        tx.executeSql(query, [], eval(succ_fun), deleteonError);
      });
    }
    
    function updatedata(query, succ_fun)
    {
      db.transaction(function(tx)
      {
        tx.executeSql(query, [], eval(succ_fun), updateonError);
      });
    }
    
    function selectitems(query, succ_fun) // Function For Retrive data from Database Display records as list
    {
      db.transaction(function(tx)
      {
        tx.executeSql(query, [], function(tx, result)
        {
          eval(succ_fun)(result.rows);
        });
      });
    }
    

    【讨论】:

      【解决方案4】:

      我有同样的问题,我发现你不能像这样使用你的 sqlite db。

      我使用了 chrome,发现 Chrome 将 DB 存储在 "C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\databases"

      Chrome 使用Databases.db 来管理数据库。

      如果您想使用您的数据库,您应该在Databases.db 中添加一条记录,并将您的文件放在"file__0" 目录中,并将其(您的数据库文件)重命名为分配给该记录的 id。

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多