在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的这种行为感到困惑,有人可以帮助我这是真的还是我做错了什么?如果需要,我可以提供代码。
感谢。
答案 0 :(得分:3)
getColumnIndex()区分大小写:
DB中的列名是:规则
cursor.getColumnIndex(“规则”) //工作正常
cursor.getColumnIndex(“规则”)//抛出错误,查看错误详情
答案 1 :(得分:1)
使用SQLite的最佳和推荐方法是声明所有表名和列名static
,final
和class
级别。例如:
// 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'")
因此,您将始终获得小写字母。使用小写字母或您喜欢的小写字母,它将起作用。