2015-09-09 89 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

相关问题