相关文章推荐
愤怒的菠萝  ·  linux升级 ...·  1 年前    · 
刚毅的莴苣  ·  JavaScript ...·  1 年前    · 
异常解决:android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow
最新推荐文章于 2023-11-28 19:12:13 发布
最新推荐文章于 2023-11-28 19:12:13 发布 阅读量 1.7k

异常log如下:

09-08 18:21:35.093 23269 23269 E SQLiteQuery: exception: Row too big to fit into CursorWindow requiredPos=0, totalRows=1; query: SELECT * FROM music_table WHERE id = ?
09-08 18:21:35.093 23269 23269 W System.err: android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:1024)
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:838)
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:145)
09-08 18:21:35.094 23269 23269 W System.err:    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
09-08 18:21:35.095 23269 23269 W System.err:    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:238)
09-08 18:21:35.095 23269 23269 W System.err:    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:277)
09-08 18:21:35.096 23269 23269 W System.err:    at android.view.View.performClick(View.java:7511)
09-08 18:21:35.096 23269 23269 W System.err:    at android.view.View.performClickInternal(View.java:7484)
09-08 18:21:35.096 23269 23269 W System.err:    at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
09-08 18:21:35.096 23269 23269 W System.err:    at android.view.View$PerformClick.run(View.java:29487)
09-08 18:21:35.096 23269 23269 W System.err:    at android.os.Handler.handleCallback(Handler.java:942)
09-08 18:21:35.096 23269 23269 W System.err:    at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 18:21:35.096 23269 23269 W System.err:    at android.os.Looper.loopOnce(Looper.java:201)
09-08 18:21:35.096 23269 23269 W System.err:    at android.os.Looper.loop(Looper.java:288)
09-08 18:21:35.097 23269 23269 W System.err:    at android.app.ActivityThread.main(ActivityThread.java:8061)
09-08 18:21:35.097 23269 23269 W System.err:    at java.lang.reflect.Method.invoke(Native Method)
09-08 18:21:35.097 23269 23269 W System.err:    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:703)
09-08 18:21:35.097 23269 23269 W System.err:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)

问题如何引起:解析出音乐专辑图片时,需要把图片转byte数组存入数据库,当下次查询数据库该专辑数据时报上面错误,行太大而无法写入CursorWindow(CursorWindow默认的最大值为2MB)

解决方法1:

Cursor cursor = db.query(TABLE, null, "id=?", new String[]{id}, null, null, null);
设置一下CursorWindow的大小即可
CursorWindow cw = new CursorWindow("test", 5000000);
AbstractWindowedCursor ac = (AbstractWindowedCursor) cursor;
ac.setWindow(cw);

第二个参数cursorWindowSize设置大小, 这里修改CursorWindow的大小为5M

解决方法2:

图片入库数据库时,先对图片进行压缩处理,尽量控制其大小在2M内

private byte[] imagemTratada(byte[] imagem_img){
    while (imagem_img.length > 500000){
        Bitmap bitmap = BitmapFactory.decodeByteArray(imagem_img, 0, imagem_img.length);
        Bitmap resized = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth()*0.8), (int)(bitmap.getHeight()*0.8), true);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        resized.compress(Bitmap.CompressFormat.PNG, 100, stream);
        imagem_img = stream.toByteArray();
    return imagem_img;
                                    ndroid.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
                                    android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=2, totalRows=3
解决办法:
Cursor cursor = db.query(TABLE, null, "id=?", new String[]{id}, null, null, null);
设置一下CursorWindow的大小即可
CursorWindow cw = new Cu
                                    ************ CAUSE OF ERROR ************android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=2833, totalRows=1569at android.database.sqlite.SQLiteConnect...
                                    主键是唯一的不能重复因为第一条数据逐渐已经存在且数据重复所以就报错不能继续往下插入了,所以我查表时只出现了一条数据,一开始我还以为是for循环出了问题,后来用map也一样,最后仔细看表才发现我把重复数据的字段设置为了主键。我建表时把inventProperNum设为主键,但我这个字段的数据是重复的,而主键是唯一的不能重复。把主键改为其他字段然后重新插入就成功了。
                                    读取数据库首先要得到数据库的位置,在编译的时候数据库的位置位于assets目录中的。但在安装调试APP时,数据库就会被放到data/data/com.example.administrator目录中,数据库的名称为assets目录中的名称。如test.db。
首先读取数据库的数据就先得到数据库:
public class SQLDB {
    //数据库存储路径
    String f
                                    我想在SQLite数据库中存储一个图像(大小约10MB) . 为此,我创建了一个DB助手,一个Dao . 一切正常,我可以创建几个记录并毫无问题地阅读它们,我甚至可以毫无问题地更新最新记录中的blob .但是,如果我回到较旧的记录并更新blob,我无法再使用blob加载此记录 .我有一个列表视图,我显示所有记录,为此我使用一个不返回blob的选择 . 此列表工作正常,但是当我单击列表中的项目时,我...
                                    1.执行的时机不一样:where是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
2.可判断的条件不一样:where不能对聚合函数进行判断,having可以。
3.执行顺序:where>聚合函数>having
包含应用程序用于管理自己的私有数据库SQLite数据库管理类。
应用程序使用这些类来管理私有数据库。如果创建内容提供程序,则可能必须使用这些类来创建和管理自己的数据库以存储内容。看见内容提供者若要了解实现内容提供程序的约定,请执行以下操作。如果您正在处理由提供程序发送给您的数据,则不使用这些SQLite类,而是使用泛型。...
异常信息:
	com.mysql.jdbc.PacketTooBigException: Packet for query is too large (XXX> 1048576).
	You can change this va...