当前位置: 首页 > 知识库问答 >
问题:

如何在Asynctask中使用数据库

卢俭
2023-03-14

我有这个密码

public  ArrayList<StationData> getAllStations(String num1){

    ArrayList<StationData> stationData = new ArrayList<>();


    Cursor cursor = mydb.rawQuery(" select * from   Stations where lines like '%"+num1+"%'   ORDER BY id DESC", null);

    if (cursor.moveToFirst()){
        do {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            char faName =  (char)(cursor.getColumnIndex("name"));
            char enName = (char) (cursor.getColumnIndex("enName"));
            char lines = (char)(cursor.getColumnIndex("lines"));
            char address = (char) (cursor.getColumnIndex("address"));
            float latitude = cursor.getFloat(cursor.getColumnIndex("latitude"));
            float longitude = cursor.getFloat(cursor.getColumnIndex("longitude"));
            StationData hh = new StationData(id, faName, enName, lines, address, latitude, longitude);

            stationData.add(hh);

        } while (cursor.moveToNext());
        cursor.close();

    }else{

    }
    return stationData;
}
  class MetroLineMaker extends AsyncTask<String,Void,String>{

        MetroDataBase metroDataBase = new MetroDataBase(getApplicationContext());
        ArrayList<StationData> metroData;
        StationData stationData = new StationData();
//        metroData = new ArrayList<>();

        protected void onPreExecute() {

        }

        @Override
        protected String doInBackground(String... strings) {


            metroData = metroDataBase.getAllStations(strings[0]);

            for (int i=0;i<metroData.size()-1 ;i++) {

                LatLng last = new LatLng(metroData.get(i).getLatitude(), metroData.get(i).getLongitude());
                LatLng next = new LatLng(metroData.get(i + 1).getLatitude(), metroData.get(i + 1).getLongitude());

//                    createMarker(metroData.get(i).getLatitude(), metroData.get(i).getLongitude());


                mMap.addMarker(new MarkerOptions()
                        .position(new LatLng(metroData.get(i).getLatitude(), metroData.get(i).getLongitude()))
                        .anchor(0.5f, 0.5f)
                        .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_metro_line_one)));


                mMap.addPolyline(
                        new PolylineOptions().add(
                                last, next
                        ).width(10).color(Color.RED)
                );


            }


            return null;
        }

        protected void onPostExecute(String result) {

        }
    }

E/AndroidRuntime:致命异常:AsyncTask#1进程:com.arnaway.metromap,pid:9493 java.lang.RuntimeException:在Android.os.AsyncTask$3执行doInBackground()时出错。done(AsyncTask.java:353)在java.util.concurrent.FutureTask.FinishCompletion(futureTask.java:383)在java.util.concurrent.FutureTask.SetExcepthtml" target="_blank">ion(futureTask.java:252)在index=0(位于com.arnaway.metromap.mainactivity$metrolinemaker.doinbackground(mainactivity.java:1028)(位于com.arnaway.metromap.mainactivity$metrolinemaker.doinbackground(mainactivity.java:1013)(位于android.os.asynctask$2)。call(asynctask.java:333)(位于java.util.concurrent.futuretask.run(futuretask.java:266)(位于在java.util.concurrent.ThreadPoolExecutor.RunWorker(ThreadPoolExecutor.java:1162) 在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:636) 在java.lang.Thread.Run(Thread.java:764)

我如何在一个异步任务中使用我的数据库并在MainActivity中显示我的标记我的异步任务也在MainActivity中。

共有1个答案

宗政法
2023-03-14

我没有数据库方面的经验,但是你的其他代码在一个活动中在哪里呢?你在哪里申报mydb?似乎您的数组列表metroData没有被填充,所以它给出了数组越界错误。

你的getAllStations方法在哪里?在metroDataBase类中?那么这个类的代码在哪里呢?

 类似资料:
  • 问题内容: AsyncTask问题 我已经遵循了一些教程,但是对我来说仍然不清楚。这是我目前在代码下面有一些问题的代码。MainActivity调用SomeClassWithHTTPNeeds,然后调用JSONParser(AsyncTask <>) 主要活动: SomeClassWithHTTPNeeds: JSONParser(AsyncTask ) 我在想:—将HTTPRequest放在do

  • 异步任务问题 我已经学习了一些教程,但我仍然不清楚。这是我目前拥有的代码,代码下面有一些问题。MainActivity调用SomeClassWithHTTPNeeds,然后调用JSONParser(异步任务 主要活动: 一些具有HTTP需求的类: JSONParser(异步任务 我在想:---把HTTPRequest放在doInBackground()中; 问题是我不知道如何:让JSONParse

  • 你能帮帮我吗,我的代码在我尝试实现async任务以在我的应用程序中显示进度对话框之前运行,已经一周了,我尝试了几种解决方案但仍然是同样的问题,请有人纠正我的代码,我的代码是: 我的logcat显示错误: 05-31 12:13:09.437:I/编舞(698):跳过64帧!应用程序可能在其主线程上做了太多工作。05-31 12:13:10.159:我/编舞(698):跳过了60帧!应用程序可能在其

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 我不想将任何参数传递给AsyncTask的doInBackground方法。 那么代码应该是什么样的呢?

  • 现在;我得到以下错误: 我以为这是因为我没有在会话中使用那个数据库;所以我去处理使用session.execute并使用sql语句use来使用数据库,但它给我带来了语法错误 check_if_exists=session.query(latest_movies_scraper).filter_by(name=dictionary['title']).first()

  • 问题内容: 我必须将数据上传到服务器。我正在使用与我的应用程序运行在同一进程上的服务。我应该使用单独的线程进行上传过程还是应该使用AsyncTask将数据上传到服务器? 更具体地说,我可以在服务类中使用AsyncTask吗?我应该使用它吗?此服务应始终在内存中运行,以便每5秒将数据发送到服务器。 问题答案: 是的,您可以,下面的代码每5秒运行一次。使用常规的连接代码发送零件。