Android Access多个Sqlite表

时间:2013-11-17 06:12:55

标签: android sqlite cursor android-sqlite

我在下面的函数中收到错误,这不是一个常量错误。它经常发生,但错误是'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;
}

1 个答案:

答案 0 :(得分:0)

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

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

此处还有其他一些问题:

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