2012-06-15 71 views
2

我無法將數據插入到數據庫中。即使db文件爲空,我也會遇到out of memory異常。BlackBerry OS 5.0中的內存不足SQLite

以下是我的代碼,請看看它。在此先感謝您的任何建議。

public class ThreeptalkDAO { 

private static ThreeptalkDAO service; 
private static Database database; 

public static ThreeptalkDAO getInstance() throws CustomException { 
    if (service == null) { 
     service = new ThreeptalkDAO(); 
     URI uri; 
     try { 
      uri = URI 
        .create("file:///SDCard/threeptalk/db/threeptalkdao.db"); 
      database = DatabaseFactory.openOrCreate(uri); 
      // createMessagesTable(); 

     } catch (Exception e) { 
      System.out.println("exp is:" + e.getMessage()); 
      Dialog.alert(e + e.getMessage()); 

      throw new CustomException(e.getMessage()); 

     } // here path is like 
      // 'file:///SDCard/Databases/mytestApp/testdatabase.db' 

    } 
    return service; 
} 

public void createMessagesTable() throws CustomException { 
    try { 
     Statement statement = database 
       .createStatement("CREATE TABLE IF NOT EXISTS messages(message_id INTEGER PRIMARY KEY,message,status,message_type_id,response,date_added,sender,office,sent_on,phoneno)"); 
     statement.prepare(); 
     statement.execute(); 
     statement.close(); 
    } catch (DatabaseException e) { 
     // TODO Auto-generated catch block 
     throw new CustomException(e.getMessage()); 
    } 

} 

public void insertMessages(Vector messages) throws CustomException { 
    for (int i = 0; i < messages.size(); i++) { 
     Messages m = (Messages) messages.elementAt(i); 
     try { 
      Statement statement = database 
        .createStatement("INSERT INTO messages (message_id,message,status,message_type_id, response,date_added,sender,office,sent_on,phoneno) VALUES (" 
          + m.getMessageID() 
          + ",'" 
          + m.getMessage() 
          + "','" 
          + "unread" 
          + "','" 
          + m.getMessageType() 
          + "','" 
          + "0" 
          + "','" 
          + m.getMdate() 
          + "','" 
          + m.getSender() 
          + "','" 
          + m.getOffice() 
          + "','" 
          + m.getSentOn() 
          + "','" 
          + WebserviceFactory.getInstance().getPhoneNo() 
          + "')"); 

      statement.prepare(); 
      statement.execute(); 
      statement.close(); 
     } catch (DatabaseException e) { 
      // TODO Auto-generated catch block 
      throw new CustomException(e.getMessage()); 
     } 
    } 
} 
+0

哪裏是被從拋出的異常?我不認爲'outofmemory'意味着你的數據庫已滿,這可能意味着你的黑莓手機內存已滿。 –

+0

您的模擬器宣稱擁有多少可用RAM和多少可用磁盤空間? –

+0

好的。是模擬器內存​​問題嗎?我知道模擬器的內存。我正在使用jre 5.0和9550模擬器。但首先我也無法創建表格 – user1427659

回答

3

在BlackBerry OS 5.0中,Sqlite的可用內存相當有限 - 512kb。這意味着即使設備報告大量的可用內存,構建大量語句或插入大量數據也可以輕鬆地使用Sqlite提供的所有內存。
它看起來像你自己構建插入語句字符串,併爲每個新行做。您可以使用預準備語句爲自己節省大量內存,然後將這些值綁定到語句中。這也有避免sqlite注入問題的優點,有意或無意。

而不是直接輸入字符串值,創建語句的循環之外,然後循環復位內,結合相同的語句對象:

Statement statement = database.createStatement(
    "INSERT INTO messages (message_id,message,status,message_type_id,"+ 
    "response,date_added,sender,office,sent_on,phoneno) VALUES (?,?,?,?,?,?,?,?,?,?)"); 
statement.prepare(); 
for (int i = 0; i < messages.size(); i++) { 
    Messages m = (Messages) messages.elementAt(i);  
    statement.reset(); 
    statement.bind(1, m.getMessageId()); 
    statement.bind(2, m.getMessage()); 
    // and so on, for all the arguments 
    statement.execute(); 
}