Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-完成任务后插入数据库_Android_Database_Class_Android Asynctask - Fatal编程技术网

Android-完成任务后插入数据库

Android-完成任务后插入数据库,android,database,class,android-asynctask,Android,Database,Class,Android Asynctask,我对Java(&android)非常陌生,因此尽管搜索范围很广,但我的知识有限,无法解决这个问题 在下面的代码中,我希望通过AsyncTask从weblink获取JASONArray。之后,我想从数组数据填充数据库 为此,我创建了RemoteConnectivity类,在该类中,我可以使用JASONArray中的所有数据填充ArrayList importdata。但问题是,我无法从RemoteConnectivity类内部访问我的数据库类mylibmandbhandler(我猜是因为它没有扩展

我对Java(&android)非常陌生,因此尽管搜索范围很广,但我的知识有限,无法解决这个问题

在下面的代码中,我希望通过AsyncTask从weblink获取JASONArray。之后,我想从数组数据填充数据库

为此,我创建了RemoteConnectivity类,在该类中,我可以使用JASONArray中的所有数据填充ArrayList importdata。但问题是,我无法从RemoteConnectivity类内部访问我的数据库类mylibmandbhandler(我猜是因为它没有扩展到Activity)。在ImportExport类中,如果我在调用RemoteConnectivity().execute()之后编写要插入到数据库中的代码[如下面的代码所示],它会在执行结束之前开始插入(很明显,因为它是AsyncTask的属性)

现在,有谁能给我指点迷津吗?或任何链接,请了解整个过程(我在至少50页的阅读中迷失了自己:())

p.S.mylibmandbhandler是我在包src文件夹中为数据库操作创建的类(不是活动)

public class ImportExport extends Activity {
    public void webimport(View v){
        new RemoteConnectivity().execute(); // START OF ASYNCTASK

        //INSERT importdata INTO DATABASE AFTER EXECUTE
        mylibmandbhandler db = new mylibmandbhandler(this);
        for (String[] s : importdata){
        db.addRecord(new mylibman(s));
        }
    }

    final ArrayList<String[]> importdata = new ArrayList<String[]>();

    private class RemoteConnectivity extends AsyncTask<Void, Void, Void> 
    {
    @Override
    protected Void doInBackground(Void... arg0) {
        ..................
        ..................
        importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

        return null;
    }

    @Override
    protected void onPostExecute(Void result1) 
    {
        // WHAT TO WRITE HERE
    }
    }
}
公共类导入端口扩展活动{
公共void webimport(视图v){
新建RemoteConnectivity().execute();//开始异步任务
//执行后将importdata插入数据库
mylibmandbhandler db=新的mylibmandbhandler(此);
对于(字符串[]s:importdata){
db.addRecord(新mylibman);
}
}
最终ArrayList importdata=新ArrayList();
私有类RemoteConnectivity扩展异步任务
{
@凌驾
受保护的Void doInBackground(Void…arg0){
..................
..................
importdata.add(数据线);//填充ARRAYLIST importdata
返回null;
}
@凌驾
受保护的void onPostExecute(void result1)
{
//在这里写什么
}
}
}

您应该在
onPostExecute
中插入数据,如下所示:

public class ImportExport extends Activity {
    public void webimport(View v){
        new RemoteConnectivity().execute(); // START OF ASYNCTASK        
    }

    final ArrayList<String[]> importdata = new ArrayList<String[]>();

    private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected Void doInBackground(Void... arg0) {
            ..................
            ..................
            importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

            return null;
        }

        @Override
        protected void onPostExecute(Void result1)
        {
            //INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
            mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
            for (String[] s : importdata){
                db.addRecord(new mylibman(s));
            }
        }
    }
}

更新:我在回答中要强调的重要一点是,我使用了
新的mylibmandbhandler(ImportExport.this);
而不是
新的mylibmandbhandler(this)作为
引用的
异步任务
不是构造函数所支持的。

您需要使用方法onPostExecute将数据插入datatable。如下所示:

private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0) {
        ..................
        ..................
        importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

        return null;
    }

    @Override
    protected void onPostExecute(Void result1)
    {
        //INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
        mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
        for (String[] s : importdata){
            db.addRecord(new mylibman(s));
        }
    }
}
私有类RemoteConnectivity扩展异步任务
{
@凌驾
受保护的Void doInBackground(Void…arg0){
..................
..................
importdata.add(数据线);//填充ARRAYLIST importdata
返回null;
}
@凌驾
受保护的void onPostExecute(void result1)
{
//执行完成后(执行后)将导入数据插入数据库
mylibmandbhandler db=新的mylibmandbhandler(ImportExport.this);
对于(字符串[]s:importdata){
db.addRecord(新mylibman);
}
}
}

当然,我一开始是这么做的……但问题是mylibmandbhandler给出了错误“构造函数mylibmandbhandler(ImportExport.RemoteConnectivity)未定义”@AbdullahFahim看到了编辑过的答案。这是因为“this”引用了该位置的AsyncTask对象。您需要将其指定为“ImportExport.this”。问题是,如果我将onPostExecute方法
new mylibmandbhandler放入其中,mylibmandbhandler会出现错误“构造函数mylibmandbhandler(ImportExport.RemoteConnectivity)未定义”(ImportExport.this);
是我想的钥匙。哦,对不起,错过了……让我试试
private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0) {
        ..................
        ..................
        importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

        return null;
    }

    @Override
    protected void onPostExecute(Void result1)
    {
        //INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
        mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
        for (String[] s : importdata){
            db.addRecord(new mylibman(s));
        }
    }
}