Phonegap / Android (java) - перемещение предварительно заполненной базы данных SQLite + папка ресурсов - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь скопировать свою предварительно заполненную базу данных в доступный для записи каталог (я имею в виду SD-карту), для этого нужно в основном скопировать всю мою папку ресурсов в моем приложении Android PhoneGap.

Я провел несколько дней исследований, и из-за моего очень ограниченного знания 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 Ответ

2 голосов
/ 21 марта 2012

Попробуйте использовать this.ctx вместо this и getApplicationContext(), 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 вам нужнофайл plugins.xml в каталоге res / xml, в который необходимо добавить:

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

Лучший способ узнать, инициализирован ли phonegap, - вызвать этот метод в javascript:

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

function onDeviceReady() 
{
    //call your plugin here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...