Android - SQLite Cursor getColumnIndex()区分大小写?

时间:2012-01-27 06:19:47

标签: android sqlite cursor illegalstateexception

在Android中使用SQLiteCursor时,我发现 getColumnIndex()的行为区分大小写,例如:

示例:

Column Name in DB was: Rules
cursor.getColumnIndex("Rules")  //workes fine
cursor.getColumnIndex("rules")  //throws error, see the error detail

文档对此没有任何说明,详情 please see this

LogCat说:

  

java.lang.IllegalStateException:无法从中读取第0行,第1行   CursorWindow。确保之前正确初始化了Cursor   从中访问数据

我对SQLiteCursor的这种行为感到困惑,有人可以帮助我这是真的还是我做错了什么?如果需要,我可以提供代码。

感谢。

4 个答案:

答案 0 :(得分:3)

getColumnIndex()区分大小写:

DB中的列名是:规则

cursor.getColumnIndex(“规则”) //工作正常

cursor.getColumnIndex(“规则”)//抛出错误,查看错误详情

答案 1 :(得分:1)

使用SQLite的最佳和推荐方法是声明所有表名和列名staticfinalclass级别。例如:

// write table name
public static final String TABLE_MESSAGE = "messages";
// and column name accordingly
public static final String COLUMN_ID = "_id";
public static final String COLUMN_MESSAGE = "message";

所以这种方法的好处是你不需要记住表名和列名的拼写和大小写等。

当您访问任何表或列时,您只需使用这些静态变量,例如:

// TABLE creation sql statement
private static final String TABLE_CREATE = "create table "
            + TABLE_MESSAGE + "( " + COLUMN_ID
            + " integer primary key autoincrement, " + COLUMN_MESSAGE
            + " text not null);";
查询时

database.query(TABLE_MESSAGE, new String[]{COLUMN_ID,COLUMN_MESSAGE}, null, null, null, null, null);

或者它可以在Cursor中使用

int index = cursor.getColumnIndex(COLUMN_MESSAGE);

这将有助于您避免此类案例敏感性和拼写错误的冲突。 :)

答案 2 :(得分:1)

另一种方法是使用PRAGMA table_info在数据库本身查询正确的名称,所以我为此编写了一个方法:

public class database {
    private SQLiteDatabase mainDB = null;

    private boolean CreateOrOpenDB() {
        try {
            if (mainDB == null || !mainDB.isOpen()) {
                mainDB = Context.openOrCreateDatabase("mainDB", SQLiteDatabase.CREATE_IF_NECESSARY, null);
            }
        } catch (SQLiteException e) {
            return false;
        }
        return true;
    }

    private String GetTrueColumnName(String TableName, String column) {
        String TrueColName = "";
        if (CreateOrOpenDB()) {
            try {
                Cursor c = mainDB.rawQuery("PRAGMA table_info(" + TableName + ");", null);

                if (c != null) {
                    if (c.moveToFirst()) {
                        do {
                            String dbcolumn = c.getString(c.getColumnIndex("name"));
                            if (column.toLowerCase().equals(dbcolumn.toLowerCase())) {
                                TrueColName = dbcolumn;
                                break;
                            }
                        } while (c.moveToNext());
                    }
                    c.close();
                }
                mainDB.close();
            } catch (Exception e) {
            }
        }
        return TrueColName;
    }
}

然后你需要打电话的是:

String CorrectName = GetTrueColumnName(TableName, "RuLeS");

是的,我知道数据库会很难。但它有效且稳定

答案 3 :(得分:1)

return readableDatabase
            .query(
                ProductosContract.ProductosEntry.TABLE_NAME,
                ProductosContract.ProductosEntry.ALL_COLUMNS_NAME_ALIAS, null, null, null, null, null
            )

您可以指定要检索的列,在该参数中将列名别名添加为小写,例如(Kotlin):

arrayOf("name as 'name'")

因此,您将始终获得小写字母。使用小写字母或您喜欢的小写字母,它将起作用。