2

データベースにデータを挿入できないことがあります。out of memorydb ファイルが空であっても例外が発生します。

以下は私のコードです、それを見てください。ご提案いただきありがとうございます。

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());
        }
    }
}
4

1 に答える 1

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();
}
于 2012-06-15T23:48:36.100 に答える