绑定()上的黑莓SQLite内存不足

时间:2012-02-21 14:25:03

标签: sqlite blackberry out-of-memory

我有一个非常复杂的数据访问层,它可以在SQLite数据库中保存大量不同的数据。一切都运行良好,除非我尝试保存超过250 kb的BLOB(可能更小,但我没有尝试过)。

这是一个SSCCE。如果您在模拟器中运行它,请不要忘记在启动应用程序之前模拟SD卡。我在9700模拟器中运行它。也许你必须在其他设备上增加名为“bigdata”的字节数组。在内存67“insert.bind(4,bigdata);”

中发生内存不足错误

我想知道的是: “内存不足”的记忆是什么?它是RAM,SQLite缓存的SD卡吗? 我能做些什么呢?我必须使用BB API 5.0,所以我不能使用6.0方法通过流访问BLOB。 有没有人有一个列表的链接,解释了哪个BB设备有多少内存? 我读了一些关于内存限制的内容。据我所知,只要设备RAM支持,它就可以保证高达1 MB。 1 MB对我来说没问题,但250 kb是不够的。 任何帮助都非常感谢。我完全陷入困境,因为我真的不知道,限制来自哪里。谢谢!

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
                }

            }
        }
    }
}

0 个答案:

没有答案