【问题标题】:Android Access Multiple Sqlite TablesAndroid 访问多个 Sqlite 表
【发布时间】:2013-11-17 06:12:55
【问题描述】:

我在下面的函数中遇到错误,这不是一个持续的错误。它经常发生,但错误是'java.lang.IllegalStateException:无法执行此操作,因为连接池已被

** if (cursor.moveToFirst()) { **

出错
public static DatabaseItem getArticle(String title) {
    SQLiteDatabase db = mActivity.getWritableDatabase();
    String query = "SELECT * FROM " + Database.DATABASE_TABLE_ARTICLES +
            " WHERE " + FEED_TITLE + "=\"" + title + "\"";
    Cursor cursor = db.rawQuery(query, null);

    if (cursor.moveToFirst()) {
        do {
            DatabaseItem item = new DatabaseItem(
            cursor.getInt(0),    // ID
            cursor.getString(1), // NAME
            cursor.getString(2), // TITLE
            cursor.getString(3), // DESCRIPTION
            cursor.getString(4), // LINK
            cursor.getString(5), // TIME
            cursor.getString(6), // THUMBNAIL
            cursor.getString(7), // ARTICLE IMAGE URL
            cursor.getBlob(8),   // ARTICLE IMAGE BYTE
            cursor.getString(9) // ARTICLE TEXT
            );
            return item;
        } while (cursor.moveToNext());
    }
    return null;
}

【问题讨论】:

  • 您是否尝试过将 .getReadableDatabase() 更改为 .getWritableDatabase() —— 是的,我知道您没有写任何东西,但有时无论出于何种原因它都有效。
  • 您应该检查Cursor 的条目,关闭它,关闭数据库,然后返回布尔结果。
  • 用函数和错误更新操作
  • 有人吗?还是想不通

标签: android sqlite cursor android-sqlite


【解决方案1】:

您应该关闭 Cursor 对象以释放一些资源。这里最简单的做法是将你的 if 包装在 try/finally 块中:

try {
  if (cursor.moveToFirst()) {
    // blah blah blah
  }
  return null;
} finally {
  cursor.close();
}

这里还有一些其他问题:

  1. 您正在使用 rawQuery 并且您没有清理和转义输入。例如,如果您使用双引号 (") 字符传递标题,则会出现 db 异常。使用 query() 方法并将标题作为选择参数传递。
  2. do/while 块没用,你总是返回第一行。
  3. 如果您总是返回第一行,为什么不将 LIMIT 1 添加到您的查询中?
  4. 理论上,sqlite 查询返回的列顺序是未定义的,因此不应使用硬编码的列索引,而应使用 cursor.getColumnIndex[OrThrow] 方法获取它们。当您在表定义的中间添加一个新列时,它还可以防止您误入歧途,但您忘记在此处更新索引。
  5. 这是一个静态方法,但您从 mActivity 实例中获取数据库。我不知道什么是 mActivity,但看起来很可疑。
  6. DatabaseItem 创建是一个可悲的样板代码示例。前段时间我创建了一个MicroOrm libary,它负责将光标行转换为普通 Java 对象和普通 Java 对象到 ContentValues(如果您需要将 POJO 保存到 db),并减少这种样板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多