【问题标题】:Adding a pre-populated database in a jQuery Mobile Phonegap application在 jQuery Mobile Phonegap 应用程序中添加预填充的数据库
【发布时间】:2014-06-01 10:49:13
【问题描述】:

我有一个应用程序构建为 iPhone 中的本机应用程序。该应用程序使用了一个 SQLite 数据库,其中有 1000 行。现在我需要使用 Phonegap 创建一个 Android 应用程序。实际上,我不知道 Phonegap 或 Android,但我知道一些 HTML、CSS 和 JavaScript。所以我决定在Phonegap中制作应用程序。

现在我想将此数据库 (SQLite) 集成到我的 jQuery Mobile 应用程序中。在 iPhone 应用程序中这很容易,但当我在 Phonegap 中寻找解决方案时,我几乎没有迷失。我查看了很多关于 jQuery Mobile 的教程,但没有一个在浏览器中有效。

我是 Phonegap 和 jQuery 的新手。

【问题讨论】:

  • 你能告诉我吗。你到底需要什么帮助。
  • 嗨 Arvinth,我已经在 sqlite 中创建了一个数据库。我想在应用程序中使用相同的数据库。我不想动态添加行,因为数据库有 1000 行。

标签: jquery sqlite jquery-mobile cordova


【解决方案1】:

我建议包含一个文件,该文件返回包含您的数据的JSON 字符串。

在应用程序初始加载时,检查数据库是否已填充,如果未填充,则运行函数来获取对象,然后将其加载到数据库中。

您可以使用简单的$.get() 方法并使用HTML5 规范来处理webSQL

这是一个例子:

我首先创建一个名为 db 的对象 -

var db;
dbHandler = {
    initialize: function() {
        db = window.openDatabase('appdb', '1.0', 'AppDB', 5000000);
        db.transaction(dbHandler.createDB, dbHandler.errorCB, dbHandler.checkDB);
    },
    createDB: function(tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS _TABLE_NAME_ (itemID unique, someField, someOtherField)');
    },
    checkDB: function(tx) {
        tx.executeSql('SELECT * FROM _TABLE_NAME_', [], dbHandler.checkDBcallBack, dbHandler.errorCB);
    },
    checkDBcallBack: function(tx, results) {
        if(results.rows.length > 0) {
            return true;
        }
        else {
            $.get('local/file/with/json/object.json', function(data) {
                dbHandler.populateDB(JSON.parse(data));
            });
        }
    },
    populateDB: function(records) {
        var len = records;
        db.transaction(function(tx) {
            for(var i =0; i < len; i++) {
                tx.executeSql('INSERT INTO _TABLE_NAME_ (someField, someOtherField) VALUES (?,?)', [], dbHandler.successCB, dbHandler.errorCB);
            }
        },
        dbHandler.errorCB,
        dbHandler.successCB);
    },
    errorCB: function(tx, err) {
        //console.log(err);
    },
    successCB: function(msg) {
        if(msg) {
            //navigator.notification.alert(msg);
        }
    }
};

一旦deviceready 事件触发调用

dbHandler.initialize();

这可能不是开箱即用的,但应该是您正在寻找的一个好的开始。

【讨论】:

    【解决方案2】:

    这对我来说很好。请按照以下步骤操作:

    你的ios应用中已经有数据库了可以直接获取数据库文件(需要Databases.dbfile__0/0000000000000001.db文件)

    • 对于 android,将预填充的 Databases.dbfile__0/0000000000000001.db 数据库保存在根文件夹 android-&gt;asset 中。

    • 在您的编码器工具中打开您的 android 项目(我正在使用 eclipse) 并打开 src-&gt;com.projectname-&gt;projectname.java 文件。

    • 请在您的projectname.java 文件中更新以下代码更改。

    sampleproj.java:

        package com.pnms.sample;
        import android.os.Bundle;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
    
        import android.annotation.TargetApi;
        import org.apache.cordova.*;
    
        public class sampleproj extends CordovaActivity 
        {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
          //Try add the below try catch
    
            try
             {
               this.copy("Databases.db","/data/data/com.pnms.sample/app_database/");
               this.copy("0000000000000001.db","/data/data/com.pnms.sample/app_database/file__0/");
             }
             catch (IOException e)
             {
              e.printStackTrace();
              }
    
            super.onCreate(savedInstanceState);
            super.init();
            // Set by <content src="index.html" /> in config.xml
            super.loadUrl(Config.getStartUrl());
            //super.loadUrl("file:///android_asset/www/index.html");
        }
    
                //Prepopulate copy function
         void copy(String file, String folder) throws IOException 
         {
    
          File CheckDirectory;
          CheckDirectory = new File(folder);
           if (!CheckDirectory.exists())
          { 
           CheckDirectory.mkdir();
          }
    
             InputStream in = getApplicationContext().getAssets().open(file);
             OutputStream out = new FileOutputStream(folder+file);
    
             // Transfer bytes from in to out
             byte[] buf = new byte[1024];
             int len; while ((len = in.read(buf)) > 0) out.write(buf, 0, len);
             in.close(); out.close();
    
           }
             }
    

    注意:您需要添加一些导入,尝试捕获功能,最后预填充复制功能

    • 在一些数据库查看器中打开您的database.db 文件(SQLite 管理器) 并找到DatabaseName &amp; DisplayName。您应该在您的 JavaScript OpenDatabase 代码中提及这些名称。

    如下所示(My dbname= Database, Displayname=EventPortal)

            .....
        function onDeviceReady()
        {
    
            db=window.openDatabase("Database", "1.0", "EventPortal", 100000);
            alert('db creating: '+db);
            db.transaction(createTable);
        }   
            .... and goes on... 
    

    就是这样。现在您可以在“数据库位置”中看到预先填充的数据库。通常/data/data/com.pnms.sample/app_database/..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2016-04-12
      • 2014-05-29
      • 1970-01-01
      • 2012-03-04
      相关资源
      最近更新 更多