【问题标题】:Phonegap/ Android (java) - Moving a pre-populated SQLite Database + assets folderPhonegap/ Android (java) - 移动预填充的 SQLite 数据库 + 资产文件夹
【发布时间】:2012-04-05 21:53:18
【问题描述】:

我正在尝试将我预先填充的数据库复制到一个可写目录(我想是 SD 卡),这基本上需要将我的整个 assets 文件夹复制到我的 phonegap android 应用程序中。

我已经做了几天的研究,由于我对 java 的了解非常有限,我似乎无法创建这个 java 插件来做简单的复制,然后我不确定如何从我的 HTML 中实际调用这个插件/ Javascript。

以下是我一直在使用网上找到的示例代码开发的当前 java 插件,有人可以帮助指导我正确的方向。

JAVA 插件:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.json.JSONArray;

import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;

    public class DataBaseHelper extends Plugin 
    {
    @Override
    public PluginResult execute(String arg0, JSONArray arg1, String arg2) 
    {
        try
        {
            String pName = this.getClass().getPackage().getName();
            this.copy("Databases.db","/data/data/"+pName+"/app_database/");
            this.copy("0000000000000001.db","/data/data/"+pName+"/app_database/file__0/");
            }
                catch (IOException e)
            {
            e.printStackTrace();
        }
        // TODO Auto-generated method stub
        String value = "OK";
        return new PluginResult(PluginResult.Status.OK, value);
    }

    //Copy Paste this function in the class where you used above part
     void copy(String file, String folder) throws IOException 
     {
         File CheckDirectory;
         CheckDirectory = new File(folder);
         if (!CheckDirectory.exists())
         { 
            CheckDirectory.mkdir();
         }

         InputStream in = this.ctx.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();            
    }
}

JAVASCRIPT 插件调用:

<script type="text/javascript" charset="utf-8" src="taxapp.js"></script>
function onDeviceReady() // CALLING THIS ON BODY LOAD
{
    dataCapture();
    window.plugins.DataBaseHelper.copy("",function(data)
    {
        alert("plugin called part 1");
        // nothing to do here
    },
    function()
    {
        alert("plugin called part 2");
        console.warn("Error calling plugin");
    }); 
}

任何帮助将不胜感激,因为我今天需要解决这个问题。提前致谢。

【问题讨论】:

标签: java android sqlite plugins cordova


【解决方案1】:

尝试使用this.ctx 代替thisgetApplicationContext()Plugin 本身不是上下文,但它在其ctx 字段中包含“真实”上下文。

添加一个 .js 文件,内容如下:

var DataBaseHelper = function() {};

DataBaseHelper.prototype.copy = function(params, success, fail) 
{
    return PhoneGap.exec(function(args) 
    {
        success(args);
    }, 
    function(args) 
    {
        fail(args);
    }, 'DataBaseHelper', 'copy', [params]);
};



PhoneGap.addConstructor(function() 
{
    PhoneGap.addPlugin('DataBaseHelper', new DataBaseHelper());
    PluginManager.addService("DataBaseHelper","full.package.name.DataBaseHelper");
});

然后在PhoneGap初始化后随时调用插件:

window.plugins.DataBaseHelper.copy("",function(data)
{
    // nothing to do here
},
function()
{
    console.warn("Error calling plugin");
});

另外,在phonegap-1.0.0之后,你的res/xml目录下需要一个plugins.xml文件,需要在其中添加:

<plugin name="DataBaseHelper" value="full.package.name.DataBaseHelper"/>

了解 phonegap 是否已初始化的最佳方法是在 javascript 中调用此方法:

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() 
{
    //call your plugin here
}

【讨论】:

  • 谢谢,这似乎解决了这个错误,但是我不确定如何在我的 HTML 页面中调用和执行这个插件。我在 HTML 页面中添加了 javascript 插件部分,然后需要调用该插件。如何做到这一点?
  • 我已经实现了您的更改,但似乎我的数据库仍未复制。我已经编辑了上面的代码,所以你可以看到我是如何调用插件的。谢谢
  • 作为旁注,我可以使用 DDMS 在模拟器中手动推送我的数据库文件,这工作正常。
  • 你的java插件中的execute方法被调用了吗?它会抛出任何错误吗?也许您需要向清单添加写权限。
  • 我相信它被称为。我已经编辑了上面的代码,在 PluginResult 中添加了 2 行。我如何检查是否发生任何错误(在模拟器和设备上加载并安装应用程序时没有错误)。至于我已经拥有 WRITE_EXTERNAL_STORAGE 的权限。非常感谢您的帮助,感觉就像我如此接近!
猜你喜欢
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多