2012-01-27 3 views
6

При работе с SQLiteCursor в Android я узнал, что getColumnIndex() ведет себя чувствительно к регистру, например:Android - SQLite Cursor 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. Убедитесь, что курсор инициализируется правильно, прежде чем доступ к данным из него

Я смущен этим поведением SQLiteCursor, может кто-то поможет мне, что это правда, или я делаю что-то не так? При необходимости я могу предоставить код.

Спасибо.

+1

Так в чем ваш вопрос ??? –

+0

См. Мой вопрос сейчас. –

ответ

3

getColumnIndex() чувствителен к регистру:

Имя столбца в БД был: Правила

cursor.getColumnIndex ("Правила") // workes штраф

курсор.getColumnIndex («правила») // бросает ошибку, увидеть детали ошибки

+4

Я не могу себе представить, почему на Земле они не нормализуют имена столбцов, поэтому они будут нечувствительны к регистру. Сам SQL не заботится об этом, почему Cursor? – nobre

+0

некоторая информация о 'why' здесь: https://code.google.com/p/android/issues/detail?id=42636 –

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"; 

поэтому преимущество этого подхода заключается в том вы не» t нужно запомнить орфографию и регистр и т. д. имен таблиц и столбцов.

при доступе к любой таблице или столбец просто использовать эти статические переменные, например:

// 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); 

это поможет избежать таких конфликтов чувствительности к регистру и орфографических ошибок. :)

+0

Большое спасибо. Но на самом деле я не создаю свою базу данных с помощью кода. Мне нужно использовать существующую базу данных. Зачем мне это нужно? потому что он имеет некоторые данные по умолчанию. Я пробовал разные подходы к «как предоставить базу данных некоторые данные по умолчанию», и я нашел, что это лучший способ создать базу данных, которая уже создана и заполнена данными по умолчанию. –

+0

, тогда вам нужно исследовать базу данных и увидеть имя таблицы и столбца один раз, а затем использовать их переменные :) –

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");

и да, я знаю, что это будет трудно в базе данных. Но он работает и стабилен

Смежные вопросы