首次运行时,Android数据未插入数据库中

时间:2016-08-14 14:24:26

标签: android sqlite

我打算创建一个应用程序,允许我们在SD卡上获取所有歌曲,然后在服务上将歌曲列表推送到SQLite。接下来,我想在活动和显示进度对话框中获取所有歌曲。 运行时遇到问题:第一次没有显示任何内容(只显示进度对话框)。但是当我再次运行它(第二次)时,它运行良好。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mListSongs = new ArrayList<>();
    lvSong = (ListView) findViewById(R.id.lv_song);
    Intent it = new Intent(this, ScanSongService.class);
    startService(it);
    mDbHelper = new DBHelper(this);
    mListSize = mDbHelper.getDBSize();
    Log.d(TAG, "-------- mListSize on activity: " + mListSize);
    new ScanSongAsyncTask(this).execute();
}

以上代码示例:
在服务上,我加载了所有歌曲并添加到DB。我记录了,没事 第一次, mListSize 为0 第二次, mListSize 为12(SD卡上的歌曲数量)。

1 个答案:

答案 0 :(得分:0)

这是因为您在服务中插入了数据并且服务(在单独的线程上运行)需要时间来完成其工作,但您可以立即获得插入数据的大小(就在您启动服务之后)。 完成插入后,您应该在服务中获得大小。

或者,您可以使用AsyncTask并在其doInBackgroung方法中执行插入,然后在其onPostExecute方法中获取大小(或执行所需的任何后处理)。您提到的使用进度条的问题也可以通过使用AsyncTask来解决(只需忽略onPostExecute方法中的进度条)。

如果您像在此处一样使用服务,请更改用于插入数据的代码,如下所示:

void insertData (){
  //your code for inserting data
  .... 
   Log.d(TAG, "-------- mListSize on activity: " + mListSize);
   new ScanSongAsyncTask(this).execute(); 
}

即。移动ScanSongAsyncTask的开头并在数据插入代码后记录Db大小。 如果您需要像更新listView那样更新UI,请使用runOnUIThread来执行此操作。