行太大,无法放入 CursorWindow requiredPos=0, totalRows=1;
Row too big to fit into CursorWindow requiredPos=0, totalRows=1;
我一直在点击这条烦人的消息!
当数据完成插入本地数据库时,我看到了这条消息
JNI critical lock held for 30.083ms on Thread[27,tid=23883,Runnable,Thread*=0xce150a00,peer=0x12cc0190,"Sqflite"]
如果我 select 来自 table 的数据,我得到
W/CursorWindow(23809): Window is full: requested allocation 3095146 bytes, free space 2096696 bytes, window size 2097152 bytes
E/SQLiteQuery(23809): exception: Row too big to fit into CursorWindow requiredPos=0, totalRows=1; query: SELECT * FROM description_table;
I/flutter (23809): DatabaseException(Row too big to fit into CursorWindow requiredPos=0, totalRows=1) sql 'SELECT * FROM defect_description_table;' args []}
我没有任何blob数据,都是String。那为什么会这样呢?
这里是json结构
[{ "id": 1, "name": "Descriptions","data": [{..},{...} ... ]},{....},{....}]
我认为问题出在数据列表上,因为它包含很多数据(它有 10298)?
解决这个问题的方法是什么?
我的插入方法
Future insertData(
BuildContext context, String urls, String accessToken) async {
CategoryTableData categoryData = CategoryTableData();
try {
var desc = List<Desc>();
var headers = {
'authorization': "Bearer" + " " + accessToken,
"Accept": "application/json"
};
var url = xxx;
var response = await http.get(url, headers: headers);
var res = json.decode(response.body);
for (var i in res) {
if (i['name'] == "Descriptions") {
desc.add(Desc(
id: i['id'], name: i['name'], data: i['data']));
}
}
await dao.batch((b) {
b.insertAll(_dao.descTable, desc);
});
categoryData = await _dao.selectAllCategories();
return categoryData;
} catch (e) {
print(e);
categoryData = await _dao.selectAllCategories();
return categoryData;
}
}
降序
class Desc extends Table {
IntColumn get id => integer().nullable()();
TextColumn get name => text().named("name").nullable()();
TextColumn get data => text().map(const ListConverter()).nullable()();
}
问题是您使用在 insertData 中调用的方法 selectAllCategories()
检索了太多数据。
处理与 sqlite 的连接的本机插件实现是给出错误的实现。
您应该使用普通的 SQL like
来限制查询
SELECT * FROM defect_description_table limit 500;
或者,如果您正在使用 Moor 或其他在 Dao 中生成此代码的包,请查看他们关于限制查询的文档。
留言Window is full: requested allocation 3095146 bytes, free space 2096696 bytes, window size 2097152 bytes
告诉您您正在尝试将 3095146 字节的行(* = 所有列)放入游标 Window(缓冲区)中,该游标 Window(缓冲区)有 2096696 字节,没有 2097152 (2Mb) 个可用字节.
简单地说,数据太多,无法提取数据。当您插入数据时这不是问题,因为没有中间和相对有限的缓冲区(光标 Window)。
当尝试检索存储图像时,您经常会看到这种情况。
有多种方法可以用来规避这个问题。
对于如此大的行,在大小方面,您可以将实际数据存储为
文件并将文件的路径存储在数据库中(这是
推荐用于图片)。
您可能会通过减少提取的列而获得一些运气。
即不使用 SELECT * 而是仅指定列
你需要的。
如果问题是列数据的累积大小,您可能可以使用 multiple 提取多个部分。
您可以 select 部分数据利用 length(column_name)
函数 ,也许使用 CASE WHEN THEN ELSE END
expression/construct 然后构建完整的数据
检索到。
可能是您无意中存储了更多数据,例如
不小心在循环中连接数据。
您需要了解存储的数据才能知道以上哪些可能有用。
我一直在点击这条烦人的消息!
当数据完成插入本地数据库时,我看到了这条消息
JNI critical lock held for 30.083ms on Thread[27,tid=23883,Runnable,Thread*=0xce150a00,peer=0x12cc0190,"Sqflite"]
如果我 select 来自 table 的数据,我得到
W/CursorWindow(23809): Window is full: requested allocation 3095146 bytes, free space 2096696 bytes, window size 2097152 bytes
E/SQLiteQuery(23809): exception: Row too big to fit into CursorWindow requiredPos=0, totalRows=1; query: SELECT * FROM description_table;
I/flutter (23809): DatabaseException(Row too big to fit into CursorWindow requiredPos=0, totalRows=1) sql 'SELECT * FROM defect_description_table;' args []}
我没有任何blob数据,都是String。那为什么会这样呢?
这里是json结构
[{ "id": 1, "name": "Descriptions","data": [{..},{...} ... ]},{....},{....}]
我认为问题出在数据列表上,因为它包含很多数据(它有 10298)?
解决这个问题的方法是什么?
我的插入方法
Future insertData(
BuildContext context, String urls, String accessToken) async {
CategoryTableData categoryData = CategoryTableData();
try {
var desc = List<Desc>();
var headers = {
'authorization': "Bearer" + " " + accessToken,
"Accept": "application/json"
};
var url = xxx;
var response = await http.get(url, headers: headers);
var res = json.decode(response.body);
for (var i in res) {
if (i['name'] == "Descriptions") {
desc.add(Desc(
id: i['id'], name: i['name'], data: i['data']));
}
}
await dao.batch((b) {
b.insertAll(_dao.descTable, desc);
});
categoryData = await _dao.selectAllCategories();
return categoryData;
} catch (e) {
print(e);
categoryData = await _dao.selectAllCategories();
return categoryData;
}
}
降序
class Desc extends Table {
IntColumn get id => integer().nullable()();
TextColumn get name => text().named("name").nullable()();
TextColumn get data => text().map(const ListConverter()).nullable()();
}
问题是您使用在 insertData 中调用的方法 selectAllCategories()
检索了太多数据。
处理与 sqlite 的连接的本机插件实现是给出错误的实现。
您应该使用普通的 SQL like
SELECT * FROM defect_description_table limit 500;
或者,如果您正在使用 Moor 或其他在 Dao 中生成此代码的包,请查看他们关于限制查询的文档。
留言Window is full: requested allocation 3095146 bytes, free space 2096696 bytes, window size 2097152 bytes
告诉您您正在尝试将 3095146 字节的行(* = 所有列)放入游标 Window(缓冲区)中,该游标 Window(缓冲区)有 2096696 字节,没有 2097152 (2Mb) 个可用字节.
简单地说,数据太多,无法提取数据。当您插入数据时这不是问题,因为没有中间和相对有限的缓冲区(光标 Window)。
当尝试检索存储图像时,您经常会看到这种情况。
有多种方法可以用来规避这个问题。
对于如此大的行,在大小方面,您可以将实际数据存储为 文件并将文件的路径存储在数据库中(这是 推荐用于图片)。
您可能会通过减少提取的列而获得一些运气。 即不使用 SELECT * 而是仅指定列 你需要的。
如果问题是列数据的累积大小,您可能可以使用 multiple 提取多个部分。
您可以 select 部分数据利用 length(column_name) 函数 ,也许使用 CASE WHEN THEN ELSE END expression/construct 然后构建完整的数据 检索到。
可能是您无意中存储了更多数据,例如 不小心在循环中连接数据。
您需要了解存储的数据才能知道以上哪些可能有用。