私のアプリは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チェックを追加しました。
あなたは私たちにあなたのアクティビティクラスのコードを表示することができますか? –
アクティビティクラスがデータベースにアクセスするために使用するコードを意味しますか? – Isengrim