2012-06-03 65 views
0

我有一個應用程序,我試圖設置一個相當大的SQLite數據庫(大約5000行的一個表)。我建立了數據庫類和一切,我的應用程序在小規模(400行)測試時正常工作,但現在當我想導入數據庫時​​,出現內存不足錯誤,我似乎無法找到一種方式來解決。Android內存不足錯誤:如何解決這個問題?

該數據庫最初是在我的Web服務器上的MySQL上,由於某種奇怪的原因,我無法將其轉換,但我設法生成一個文本文件,查詢添加了所有5000行,大小爲11.5mb。我在我的資產文件夾這個文件,我想這個把它變成我的DB:

public void onHandleIntent(Intent intent) { 

     DBAdapter db = new DBAdapter(getApplicationContext()); 
     db.open(); 

     try { 
      InputStream is = getAssets().open("verbs_sql.txt"); 
      db.executeSQL(convertStreamToString(is)); 
     } catch (IOException e) {} 

     db.close(); 

     // Run main activity 
     Intent i = new Intent(DatabaseReceiver.this, BaseActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
     DatabaseReceiver.this.startActivity(i); 
    } 

    public static String convertStreamToString(InputStream is) throws IOException { 
     Writer writer = new StringWriter(); 

     char[] buffer = new char[2048]; 
     try { 
      Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
      int n; 
      while ((n = reader.read(buffer)) != -1) { 
       writer.write(buffer, 0, n); 
      } 
     } finally { 
      is.close(); 
     } 
     String text = writer.toString(); 
     return text; 
    } 
} 

的內存不足的錯誤發生在StringWriter的(),所以它看起來喜歡它把那個大文件上到內存。我該如何解決這個問題?我也嘗試循環遍歷所有5000行,但在30秒之後,我又重新陷入了內存不足的境地。

回答

0

Sqlite數據庫只是文件,當您嘗試在手機上運行數千個插入程序時,您會反覆打擊SD卡以進行文件訪問。

你要做的是在桌面上創建sqlite數據庫,並在應用程序中包含已創建的數據庫。如果您需要定期更新數據庫中的信息,則可以將其發佈到網站上並讓應用程序下載它,只要確保只通過Wifi進行大量下載即可。

查看此Tech Talk瞭解更多信息。

編輯:請參閱this關於在Windows中創建sqlite數據庫並將其包含在您的應用程序中的更多信息。

+0

因此,我應該在外部創建一個SQL文件,將其放在資產文件夾中,並找出如何在數據庫類中使用該SQL文件? – Qasim

+0

查看[這裏](http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/),瞭解有關製作sqlite數據庫和讀取該數據庫的完整說明Android應用。 – antew

+0

使用鏈接中提到的數據庫管理器,我能夠在文件中成功創建我的數據庫,並完成了指南的其餘部分:)謝謝 – Qasim

1

在這個視頻由谷歌:

http://www.youtube.com/watch?v=_CruQY55HOk

內存管理進行說明。由於你的方法在小範圍內工作,聽起來像你使用更多的內存比你的應用程序可用的堆。

該視頻解釋了內存管理以及如何增加堆大小(相信它來自Android 4.0及更高版本)。

+0

該視頻現在嚴重過時並且無關緊要。 – zyamys

0

我相信你可以以你想要的方式做到這一點。您發佈的代碼的問題是您正試圖將整個文件轉換爲字符串。我相當肯定,即使在臺式機上,這也會失敗。

我相信如果您嘗試一次讀取一行並執行SQL,您會有更好的運氣。然後閱讀下一行。你也可以通過zip傳遞來減小文件的大小。

如果我能找到幾分鐘,我會附上一些代碼。

0

我有同樣的問題。我嘗試了很多方法來解決它,但都失敗了。最後我找到了原因,我想知道。在我的情況下,錯誤的原因是我在日誌貓打印整個響應字符串。這些數據非常龐大,並且需要堆內存。 採取批量數據的以下

  1. 刪除日誌貓印刷的照顧。
  2. 嘗試在一種反應下對所有操作只使用一個J-SON陣列(全部重複使用)。
  3. 儘量避免使用數組列表。
  4. 當每個項目從J-Son Array迭代時插入項目。這意味着不要按照我們將項目作爲對象並將其放入數組列表並將數組列表傳遞給DB-helper的方法,並從那裏迭代對象並插入。
相關問題