2016-05-19 10 views
2

私のアプリはSQLiteDatabaseを利用して、2人のarraylistを別々のテーブルに保存します。バックグラウンドでデータベースを更新する(Android)

私は、データベースを更新するたびに(テーブルの削除、再作成、arraylistsでのデータの読み込みを含む)データベースが更新されるたびに、アプリケーションが一時的にフリーズし、logcatで次のメッセージが表示されることに気付きました: " /振付師:236フレームをスキップしました!アプリケーションがメインスレッドであまりにも多くの作業をしている可能性があります。

それが更新し確認するために、私は、データベースを更新するために使用されるコードを削除しました。その時、私はもはや警告メッセージを得ていない、私のアプリはフリーズしなかった。

これは、それがテーブルを更新するために使用され、SQLiteOpenHelperを拡張し、私のカスタムDBヘルパー、内部のコードです:

public void insertData(ArrayList<SavedWifiHotspot> hotspots, ArrayList<MarkerOptions> markers) { 
    Log.d("insert LocationsDB", "Data inserted"); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues hotspotValues = new ContentValues(); 
    ContentValues markerValues = new ContentValues(); 
    for(SavedWifiHotspot hotspot : hotspots) { 
     hotspotValues.put("Ssid", hotspot.getSsid()); 
     hotspotValues.put("Password", hotspot.getPassword()); 
     hotspotValues.put("LocationName", hotspot.getHotspotLoc()); 
     hotspotValues.put("Lat", hotspot.getLatitude()); 
     hotspotValues.put("Lng", hotspot.getLongitude()); 
     db.insert(HOTSPOT_TABLE_NAME, null, hotspotValues); 
    } 
    for(MarkerOptions marker : markers) { 
     markerValues.put("LocationName", marker.getTitle()); 
     markerValues.put("Lat", marker.getPosition().latitude); 
     markerValues.put("Lng", marker.getPosition().longitude); 
     db.insert(LOCATION_TABLE_NAME, null, markerValues); 
    } 
} 

そして、これは、それらが更新される前にテーブルをクリアするために使用するコードです:

public void clearData() { 
    Log.d("clear LocationsDB", "Tables cleared"); 
    SQLiteDatabase db=this.getWritableDatabase(); 

    String dropHSTable = "DROP TABLE IF EXISTS " 
      + HOTSPOT_TABLE_NAME + ";"; 

    String dropLocTable = "DROP TABLE IF EXISTS " 
      + LOCATION_TABLE_NAME + ";"; 

    db.execSQL(dropHSTable); 
    db.execSQL(dropLocTable); 

    createTables(db); 
} 

は、どのように私は、バックグラウンドで自分のデータベースを更新して行くべきですか?私はスレッドについて読んだことがありますが、これを行うスレッドを使用する必要がありますか?

編集:これは私のコメントを参照して、エラーになります。

for(MarkerOptions marker: markers[0]) { 

そしてライン119は、次のとおり:

FATAL EXCEPTION: AsyncTask #5 
Process: com1032.cw2.fm00232.fm00232_assignment2, PID: 8830 
java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:300) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExe 
    at java.lang.Thread.run(Thread.java:818)cutor$Worker.run(ThreadPoolExecutor.java:587) 
Caused by: java.util.ConcurrentModificationException 
    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 
    at com1032.cw2.fm00232.fm00232_assignment2.LocationsDB$3.doInBackground(LocationsDB.java:124) 
    at at com1032.cw2.fm00232.fm00232_assignment2.LocationsDB$3.doInBackground(LocationsDB.java:119) 
    at android.os.AsyncTask$2.call(AsyncTask.java:288) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 

参考のために、ライン124は

new AsyncTask<ArrayList<MarkerOptions>, Void, Void>() { 

EDIT2:上記の問題を解決しました。私のアプリは、空のリストを使ってデータの挿入メソッドを呼び出すようになっていました。そこで、データの挿入方法の前に.emptyチェックを追加しました。

+0

あなたは私たちにあなたのアクティビティクラスのコードを表示することができますか? –

+0

アクティビティクラスがデータベースにアクセスするために使用するコードを意味しますか? – Isengrim

答えて

2

非同期タスクは良いアイデアのように聞こえます。

public void insertData(ArrayList<SavedWifiHotspot> hotspots, ArrayList<MarkerOptions> markers) { 
Log.d("insert LocationsDB", "Data inserted"); 

new AsyncTask<ArrayList<SavedWifiHotspot>, Void, Void>() { 

     @Override 
     protected Void doInBackground(ArrayList<SavedWifiHotspot>... hotspots) { 
      ContentValues hotspotValues = new ContentValues(); 
      for(SavedWifiHotspot hotspot : hotspots[0]) { 
       hotspotValues.put("Ssid", hotspot.getSsid()); 
       hotspotValues.put("Password", hotspot.getPassword()); 
       hotspotValues.put("LocationName", hotspot.getHotspotLoc()); 
       hotspotValues.put("Lat", hotspot.getLatitude()); 
       hotspotValues.put("Lng", hotspot.getLongitude()); 
       db.insert(HOTSPOT_TABLE_NAME, null, hotspotValues); 
      } 

     } 
    }.execute(hotspots); 

new AsyncTask<ArrayList<MarkerOptions>, Void, Void>() { 

     @Override 
     protected Void doInBackground(ArrayList<MarkerOptions>... options) { 
      ContentValues hotspotValues = new ContentValues(); 
      for(MarkerOptions marker: options[0]) { 
       markerValues.put("LocationName", marker.getTitle()); 
       markerValues.put("Lat", marker.getPosition().latitude); 
       markerValues.put("Lng", marker.getPosition().longitude); 
       db.insert(LOCATION_TABLE_NAME, null, markerValues); 
      } 

     } 
    }.execute(options); 
} 


public void clearData() { 
    Log.d("clear LocationsDB", "Tables cleared"); 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      SQLiteDatabase db=this.getWritableDatabase(); 

      String dropHSTable = "DROP TABLE IF EXISTS " 
       + HOTSPOT_TABLE_NAME + ";"; 

      String dropLocTable = "DROP TABLE IF EXISTS " 
       + LOCATION_TABLE_NAME + ";"; 

      db.execSQL(dropHSTable); 
      db.execSQL(dropLocTable); 
      createTables(db); 
     } 
    }.execute(); 


} 
+0

使い方を学ぶのはかなり簡単ですか?基本的に私が作っているこのアプリは、授業のためのものなので、少し時間が限られています。 – Isengrim

+0

それはあなたのためにかなり終わりました。それがスタックトレースをポストするとクラッシュする場合、私はそれを整理するのに役立ちます。 –

+0

うまく動作するようです。私は自分のデータベースを閉じることに問題があります。通常、私はアクティビティが一時停止するとデータベースを閉じますが、insertDataを呼び出す前にifステートメントでdb.isOpenをチェックしても、insertDataが閉じられたデータベースにアクセスしようとしているようです。また、この警告は、doInBackgroundメソッド "varargsパラメータのチェックされていないジェネリック配列の作成"を示しています。 – Isengrim

関連する問題