在确定数据库并没有损坏的情况下,如果出现sqlite error 11,那就很可能是因为在加载写入数据库的时候出现了影响加载进行的动作。

    如果数据库很小,如50M以下,那么一般不用考虑这个问题,因为现在的手机、平板的处理速度能够秒杀这个数量级的数据库的读写操作。

    然而,如果数据库超过50M,那么就要慎重考虑这个问题了,因为通常这个时候在第一次使用、加载数据库的时候需要花费几秒到十几秒的时间。如果在这个时间段里出现点击屏幕等操作,影响到数据库的正常加载,那么,将会导致以后要使用的数据库加载不完整,就会出现sqlite error 11,同时机器会自动删除该无用的数据库。

    为了解决这个问题,就要确保用户操作不会干扰到后台数据库的加载。我想到的办法便是使用processDialog。通过使用processDialog,把屏幕的焦点让给它,同时新开一个线程去进行数据库加载的操作。

  1. private void firstUse() { 
  2.     if (SettingUtils.getBooleanValue(this, SettingUtils.KEY_FIRST_USE)) { 
  3.         dialog = ProgressDialog.show(MainActivity.this"加载数据"
  4.                 "加载数据中...\n(第一次使用需要加载数据,请耐心等待,谢谢!\n加载完成后程序会自动关闭。)"true); 
  5.         new Thread() { 
  6.             public void run() { 
  7.                 try { 
  8.                     FileUtil.initDatabase(MainActivity.this"yourDatabase"); 
  9.                     SettingUtils.saveBooleanValue(MainActivity.this
  10.                             SettingUtils.KEY_FIRST_USE, false); 
  11.                     ttsManager.installEngineFile(); 
  12.                 } catch (Exception e) { 
  13.                     e.printStackTrace(); 
  14.                 } finally { 
  15.                     dialog.dismiss(); 
  16.                     dbManager.close(); 
  17.                     finish(); 
  18.                 } 
  19.             } 
  20.         }.start(); 
  21.     } 

     为了保险起见,在该段代码的实现中,是让程序在数据库加载完成后就自动关闭。这样保证了用户下一次的交互是在程序的数据库完整性得到保证的情况下交互的。