gpt4 book ai didi

Android SQLite 数据库无法选择具有较大值的行,抛出 IllegalStateException

转载 作者:搜寻专家 更新时间:2023-11-01 09:05:25 25 4
gpt4 key购买 nike

我创建了下面的类,用于将数据保存到 SQLite 数据库。如您所见,它只是一个键/值映射。 KEY 是一个 TEXT 字段,VALUE 是一个 BLOB。

除了在一种情况下,它工作得很好:我使用“添加”来添加一个长度约为 2,500,000 个字符的字符串。事实上,它是一个 JSON 编码的字符串(我也尝试将 javascript 样式的 encodeURIComponent 应用于它,以确保没有非法字符干扰)。

在这种情况下,值被成功添加(没有抛出错误,add() 返回 true)。但是,当我随后立即调用 get(key) 时,会从 cursor.getString(0) 中抛出 IllegalStateException。

具体来说:

"Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it." (id=830026207728) 

我检查了游标对象,没有发现任何问题(mCount==1、mColumns==String[1] 等)。

class DatabaseHandler extends SQLiteOpenHelper {

// All Static variables
// Database Version
private static final int DATABASE_VERSION = 2;

// Contacts Table Columns names
private static final String KEY_KEY = "key";
private static final String KEY_VAL = "value";

public DatabaseHandler(Context context) {
super(context, Defines.DATA_PREFIX, null, DATABASE_VERSION);
}

public String getTableName() {
return "storage";
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
String q = "CREATE TABLE " + this.getTableName() + "(" + KEY_KEY + " TEXT PRIMARY KEY," + KEY_VAL + " BLOB" + ")";
db.execSQL(q);
}

// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + this.getTableName());

// Create tables again
onCreate(db);
}

boolean add(String key, String value) {
SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_KEY, key); // Contact Name
values.put(KEY_VAL, value); // Contact Phone

// Inserting Row
long res = db.insertOrThrow(this.getTableName(), null, values);
db.close(); // Closing database connection
return res >= 0;
}

String get(String key) {
SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(this.getTableName(), new String[] { KEY_VAL }, KEY_KEY + "=?", new String[] { key }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();

if(cursor == null)
return null;

String ret = null;
try {
ret = cursor.getString(0);
} catch(CursorIndexOutOfBoundsException e) {
ret = null;
} catch(IllegalStateException e) {
ret = null;
}
cursor.close();
return ret;
}

int count(String key) {
String countQuery = "SELECT * FROM " + this.getTableName()+" WHERE "+KEY_KEY+" = ?";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, new String[] { key });
int ret = cursor.getCount();;
cursor.close();

// return count
return ret;
}

void delete(String key) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(this.getTableName(), KEY_KEY + " = ?", new String[] { key });
db.close();
}

int update(String key, String value)
{
SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_KEY, key);
values.put(KEY_VAL, value);

// updating row
return db.update(this.getTableName(), values, KEY_KEY + " = ?", new String[] { key });
}
}

最佳答案

经过进一步调查,控制台窗口告诉我“光标窗口”已满,例如空间不足。请参阅此线程:Android: Cursor Window is full

我的解决方案是“分块”数据。例如,“添加”函数检测字符串是否大于固定长度,在这种情况下,它会为字符串存储多个条目(使用许多行)。然后“get”函数检测到这一点并重新组装 block 。

关于Android SQLite 数据库无法选择具有较大值的行,抛出 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com