2016-02-28 62 views
0

我有一个与我的应用程序sqlite表...但将需要尽快添加/删除大量数据集。我有很多选择。现在,我有大约35,000行,我可以在大约15秒内更新。我更喜欢更快的东西。本质上只需要一列作为我的辅助文本。将大量数据导入到android上的sqlite数据库 - 时间太长。需要替代品

现在,用户下载一个txt文件,然后该文件被传递给下面的方法。

public boolean installLanguageFile(String resourceId) { 

     SQLiteDatabase db; 
     db = new DataBaseHelper(getContext()).getWritableDatabase(); 
     try { 

      File mFile = new File(getActivity().getFilesDir() + resourceId); 

      InputStream insertsStream = new FileInputStream(mFile); 
      BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertsStream)); 

      long lengthOfFile = 34504; 
      long total = 0; 
      int rowId = 1; 

      String sql = "UPDATE Story_Data SET text2 = ('?') WHERE _id = ?"; 
      db.beginTransaction(); 
      SQLiteStatement stmt = db.compileStatement(sql); 
      while (insertReader.ready()) { 
       total += rowId; 
       stmt.bindString(1, insertReader.readLine()); 
       stmt.execute(); 
       stmt.clearBindings(); 
       publishProgress("" + (rowId * 100/lengthOfFile)); 
       rowId++; 
      } 

      db.setTransactionSuccessful(); 
      db.endTransaction(); 

      insertReader.close(); 

      //mCallback.reloadView(); 
      return true; 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 

    } 
+0

是否存在本地更改,或者是否是来自服务器的所有数据?如果它全部来自服务器,最快的方法就是下载一个新的数据库文件。 –

+0

如果由于其他表具有用户输入而无法执行此操作,但此表来自服务器 - 删除此表并重新创建它,所有插入操作可能会比更新每一行更快。但是这需要您进行基准测试和复查。 –

+1

如果您不在每次迭代中发布进度,您是否尝试过快多快?对于初学者尝试完全删除它 –

回答

0

更新所有到位的行需要数据库移动大量数据。
如果可能,请先删除所有旧行,然后插入所有新行。

,最快的方式是避免文本文件:船舶新的数据作为一个数据库文件,ATTACH更新文件到主数据库,然后将数据在一个声明中这样拷贝过来:

INSERT INTO main.Story_Data(ID, text2) SELECT ID, text2 FROM updateDB.Story_Data; 
+0

谢谢。这工作...几乎立即。但是,我有一个问题......原始表格有其他几列。所有这些保持不变。 Id,章节,text1,text2(空白)。当我从只有文本(没有ID)的新数据库复制时,它只是追加到34500之后,而不是进入text1旁边的实际列(我想保留两个文本)。 –

+0

你别无选择,只能更新。或者,使用两个始终连接的表。 –

+0

如果您有任何建议,我非常接近。下面的命令可以工作,但所有的行都是一样的。 UPDATE Story_Data set text2 =(SELECT text FROM updateDB.Story_Data) –

相关问题