У меня довольно сложный слой доступа к данным, который сохраняет много разных данных в базе данных 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
}
}
}
}
}