2015-09-09 190 views
0

我需要在我的android應用程序中插入大量數據到數據庫。我有一個對話框,其中包含一個列表視圖,其中包含行名,日期,頻率,其頻率值可以是「每日」,「每月」,「季度」,「每年」等。在將行添加到列表視圖後,我需要單擊done按鈕將這些數據保存到數據庫中。我需要根據其頻率值來存儲每行。也就是說,如果頻率值是「每日」,我需要將1095(即3 * 365 - > 3日的每日記錄)記錄存儲到該名稱的數據庫中,類似地對於每個頻率值(「每月」 - > 3 * 12,「Quarterly」 - > 3 * 4,...),所以它會導致行向數據庫的批量插入,並且導致執行時間很長,因此用戶可能感覺不好,他不能做任何其他在應用程序中的操作沒有完成this.I使用ORMLite添加數據到數據庫。我已經完成了這一點如下。如何將大量的記錄添加到數據庫中android

for (int i = 0; i < listAdapter.getCount(); i++) { 
    Account rowAcct = new Account(); 
    rowAcct = listAdapter.getItem(i); 
    if (rowAcct.getFreq().equals("Daily")) { 
     for (int y = 0; y < 1095; y++) { 
      Account nwEvt = new Account(); 
      dueDt = saveController.getNextDay(dueDt); 
      nwEvt.setDueDate(dueDt); 
      evtId = saveController.createAcc(nwEvt); 
     } 
    } else if (rowAcct.getFreq().equals("Monthly")) { 
     for (int y = 0; y < 35; y++) { 
      Account nwEvt = new Account(); 
      Date dueDt = saveController.getNextMonth(dueDt); 
      nwEvt.setDueDate(dueDt); 
      saveController.createAcc(nwEvt); 
     } 
    } else if (rowAcct.getFreq().equals("Quarterly")) { 
     for (int y = 0; y < 11; y++) { 
      Account nwEvt = new Account(); 
      dueDt = saveController.getQuarterMonth(dueDt); 
      nwEvt.setDueDate(dueDt); 
      evtId = saveController.createAcc(nwEvt); 
     } 
    } else if (rowAcct.getFreq().equals("Half-Yearly")) { 
     for (int y = 0; y < 5; y++) { 
      Account nwEvt = new Account(); 
      Date dueDt = saveController.getHalfYear(dueDt); 
      nwEvt.setDueDate(dueDt); 
      saveController.createAcc(nwEvt); 
     } 
    } else if (rowAcct.getFreq().equals("Yearly")) { 
     for (int y = 0; y < 2; y++) { 
      Account nwEvt = new Account(); 
      Date dueDt = saveController.getNextYear(dueDt); 
      nwEvt.setDueDate(dueDt); 
      saveController.createAcc(nwEvt); 
     } 
    } 
} 
dialog.dismiss(); 

我如何減少這種插入時間或背景使這個插入過程,並免費做其他事情的應用程序的用戶?請建議我通過讓用戶免費來執行此操作的最佳方式。

+1

運行插入一個新的線程。也許使用'AsyncTask'。 http://developer.android.com/reference/android/os/AsyncTask.html – Breavyn

+0

我認爲asynctask是不安全的,如果你不控制orientation.AsyncTask不是爲很長的過程設計的。 – KJEjava48

回答

0

您需要使用IntentService類及其爲這個處理程序,這是專爲長時間運行task.Request的IntentService類點擊完成後按鈕,並通過必要的數據與該意圖像下面

Intent intentEv= new Intent(Intent.ACTION_INSERT, null, getApplicationContext(), MyIntentService.class); 

       intentEv.putExtra("requestId", 101); 
       intentEv.putExtra("listAccounts",arrayList); 
       startService(intentEv); 

這將要求Intentservice類,然後你可以對使用您的IntentService的onHandleIntent(意向意圖)功能後臺數據庫插入。

public class MyIntentService extends IntentService{ 
public static final int STATUS_RUNNING = 0; 
public static final int STATUS_FINISHED = 1; 
public static final int STATUS_ERROR = 2; 
public MyIntentService() { 
    super("BulkInsertionService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Log.d(TAG, "Service Started!"); 
    ArrayList<Account> listAccounts=(ArrayList<Account>) intent.getSerializableExtra("listAccounts"); 
    /* perform the long running insert operations now.. */ 
this.stopSelf(); 
} 
} 

而且初始化你IntentService類AndroidManifest.xml檔案

+0

感謝您的回答 – KJEjava48

1

第一個需要在工作線程中使用DB執行所有工作。只需使用android內置版AsyncTasks

第二次檢查this,this提高在db中插入的答案。

+0

我認爲asynctask是不安全的,如果你不控制orientation.AsyncTask不是爲很長的過程設計的。行數很大,所以它不好使用AsyncTask,因爲它沒有綁定到Activity生命週期,即如果你的活動它並不意味着AsyncTask也會死亡,所以如果你嘗試啓動一個AsyncTask,並且不知何故,如果你的活動死亡了,比如屏幕旋轉或者返回鍵被按下,那麼在重新啓動另一個AsyncTask時會產生,而不是被鏈接到已經執行的AsyncTask 。因此重複相同的操作。 – KJEjava48

+0

使用片段。 'setRetainInstance(真);'。鎖定在'onPreExecute'中啓動此進程的按鈕,並在'onPostExecute'中重新啓用。您也可以在寫入數據庫的方法或塊上使用'synchronized'關鍵字。 – Breavyn

+0

你可以啓動服務並運行AsyncTask服務 – ant

相關問題