BlackBerry SQLite не хватает памяти на bind () - PullRequest
1 голос
/ 21 февраля 2012

У меня довольно сложный слой доступа к данным, который сохраняет много разных данных в базе данных SQLite. Все работает хорошо, за исключением случаев, когда я пытаюсь сохранить большие двоичные объекты, размер которых превышает 250 КБ (возможно, даже меньшие, но я не пробовал).

Вот SSCCE. Если вы запускаете его в симуляторе, не забудьте имитировать SDCard перед запуском приложения. Я запускаю его в симуляторе 9700. Возможно, вам придется увеличить массив байтов, называемый «bigdata» на других устройствах. Ошибка нехватки памяти происходит в lin 67 "insert.bind (4, bigdata);"

То, что я хотел бы знать, это: Какая память у "вне памяти"? Это ОЗУ, SDCard кеш SQLite? Что я могу с этим поделать? Я ДОЛЖЕН использовать BB API 5.0, поэтому я не могу использовать методы 6.0 для доступа к BLOB через потоки. У кого-нибудь есть ссылка на список, который объясняет, сколько памяти имеет какое устройство BB? Я прочитал кое-что об ограничении памяти. Насколько я помню, было гарантировано до 1 МБ и больше, пока поддерживается ОЗУ устройства. 1 МБ было бы хорошо для моего использования, но 250 КБ недостаточно. Любая помощь высоко ценится. Я полностью застрял, потому что я действительно не знаю, откуда исходит ограничение. Спасибо!

SSCCE:

    import net.rim.device.api.database.Database;
import net.rim.device.api.database.DatabaseFactory;
import net.rim.device.api.database.Statement;
import net.rim.device.api.io.URI;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;

public class FirstSQLiteApp extends UiApplication
{

    public FirstSQLiteApp()
    {
        pushScreen(new InnerClassScreen());
    }

    public static void main(final String[] args)
    {
        final FirstSQLiteApp firstSQLiteApp = new FirstSQLiteApp();
        firstSQLiteApp.enterEventDispatcher();
    }

    class InnerClassScreen extends MainScreen
    {

        public Database sqliteDB;
        Statement       insert;
        Statement       s;
        byte[]          bigdata;

        public InnerClassScreen()
        {

            final LabelField title = new LabelField("Create DB Application", LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH);
            setTitle(title);
            add(new RichTextField("Initializing db create process..."));

            bigdata = new byte[250000];
            for (int i = 0; i < bigdata.length; i++)
            {
                bigdata[i] = 0x43;
            }

            try
            {
                final URI uri = URI.create("file:///SDCard/Databases/blobtest.db");
                sqliteDB = DatabaseFactory.openOrCreate(uri);
                add(new RichTextField("Status: Database was successfully created."));
                s = sqliteDB.createStatement("CREATE TABLE IF NOT EXISTS MyTable (first LONG, second SMALLINT, third INTEGER, data1 BLOB, data2 BLOB )");
                s.prepare();
                s.execute();

                add(new RichTextField("Status: Table MyTable created."));

                insert = sqliteDB.createStatement("INSERT INTO MyTable VALUES(?,?,?,?,?)");

                insert.prepare();

                final byte[] data2 = new byte[100];

                try
                {
                    insert.bind(1, 11111L);
                    insert.bind(2, (short) 222);
                    insert.bind(3, 3333);
                    insert.bind(4, bigdata); //HERE THE OUT OF MEMORY OCCURS
                    insert.bind(5, data2);

                    insert.execute();
                }
                catch (final Exception e)
                {
                    System.out.println("+++CUSTOM_OUTPUT+++" + e.getMessage());
                }

            }
            catch (final Exception e)
            {
                System.out.println(e.getMessage());
                add(new RichTextField("Status: Database was not created."));
                add(new RichTextField(e.getMessage()));
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    insert.close();
                    s.close();
                    sqliteDB.close();
                }
                catch (final Exception e)
                {
                    //amen
                }

            }
        }
    }
}
...