我有一个非常复杂的数据访问层,它可以在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
}
}
}
}
}