2016-03-23 11 views
0

ここに私がしたいことがあります。私はウェブサイトのデータベースからデータをダウンロードし、それをsqliteに保存したいと思います。私たちは、このアプリケーションのオフラインバージョンを使用するためにこれをやっています。これは単なるビューなので、更新と削除のメソッドはありません。あまりにも多くのデータを含むAndroid jsonのsqliteへの挿入

私はAndroid Sqliteにjsonをデータをほとんど入れずに挿入しようとしていますが、成功しています。しかし、ここで私は長いデータでそれをやろうとすると問題が発生します。私はテーブルに約19,000行を挿入する必要があります。私はクラスがよくやってますが、その多くのデータを挿入する際には時間がかかるとAndroidがエラーを与えているユーザーに進捗

Progress dialog sample

のアイデアを与えるためにUiThread上で実行されますProgressDialogを使用しています。時折、「応答時間が長すぎます:待機またはキャンセル」というエラーが表示されます。時には、このような...

Unfortunately, the App had stopped

しかし、ログに、私はそれがまだテーブルに挿入されていることを確認できるので、アプリケーションが実際に停止しませんでした。 Androidはそのエラーを示しています。私はそれがまだ挿入されていることを認識していないと思うか、問題のように思われるか分かりません。エラーのダイアログボックスで[OK]をクリックすると、ログの挿入が停止します。

ui.setting.UserSettingsActivity: insertEquipmentProfile: 16494 
ui.setting.UserSettingsActivity: insertEquipmentProfile: 16495 
ui.setting.UserSettingsActivity: insertEquipmentProfile: 16496 

はその後、その後、それはエラーのこの種類をログに記録します。

E/SQLiteLog: (5) database is locked 
E/SQLiteDatabase: Failed to open database '/data/data/com.name.android.name/databases/name_android_offline.db'. 
               android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode 

私は何をすべき?このログが重要かどうかは分かりませんが、これを追加します。タイムアウトのようなものですが、分かりません。

W/ActivityManager: Activity pause timeout for ActivityRecord{f2e77e1 u0 ui.setting.UserSettingsActivity t762 f} 

私も自分のデータベース・ヘルパー・メソッド内でトランザクションを追加しようとしましたが、それは助けにはなりませんでした。

database.beginTransaction(); 
database.setTransactionSuccessful();  
database.endTransaction(); 

テーブルにあまりにも多くの行を挿入する方法はありますか?私は私の問題を説明するために何を提供するのか分からないが、私のコードは4000行を挿入する際にうまく動作するので、あまりにも多くのデータを挿入しながらアプリケーションをクラッシュさせない方法を探している。

+0

メインスレッドに挿入していますか?同期/マルチスレッドですか? –

答えて

2

「アプリケーションが応答していません」(ANR)ダイアログにつながるメインスレッドですべてのデータベース操作を実行しているとします。したがって、これらの操作をバックグラウンドスレッドで実行する必要があります。 AsyncTask、Handlers、(Intent)Service、RxJava(スケジューラ付き)、独自のスレッド/スケジューリングソリューションなどを見てください。

+0

[Processes and Threads](http://developer.android.com/guide/components/processes-and-threads.html#Threads)にこれを説明する公式文書があります。具体的には、_Threads_セクションの段落4を参照してください:「具体的には、すべてがUIスレッドで発生している場合、ネットワークアクセスやデータベースクエリなどの長い操作を実行すると、UI全体がブロックされます。数秒(現在約5秒)の間、ユーザーは悪名高い「アプリケーションが応答していません(ANR)」ダイアログが表示されます。 –

-1

データを取得するためにRetrofitを使用し、データベースに挿入するPOJO0とgreenDaoを変換します。

dao.insertOrReplaceInTx(pojoArray[]); 
関連する問題