Phonegap / Android(java) - 移动预先填充的SQLite Database + assets文件夹

时间:2012-03-21 11:21:31

标签: java android sqlite plugins cordova

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

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

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

JAVA PLUGIN:

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 PLUGIN CALL:

<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");
    }); 
}

任何帮助都会非常感激,因为我今天需要解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:2)

尝试使用this.ctx而不是thisgetApplicationContext()Plugin本身不是一个上下文,但它在{{{{}中保留了'真实'上下文1}} field。

使用以下内容添加.js文件:

ctx

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

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-1.0.0之后,您需要在res / xml目录中有一个plugins.xml文件,您需要在其中添加:

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

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

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