2012-01-27 11 views
6

Pracując z SQLiteCursor w Androidzie poznałem, że getColumnIndex() zachowuje wielkość liter na przykład:Android - SQLite Cursor getColumnIndex() rozróżnia wielkość liter?

Przykład:

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

Dokumentacja mówi nic o tym, że dla szczegółyplease see this.

LogCat mówi:

java.lang.IllegalStateException: Nie można odczytać wiersz 0 kol -1 od CursorWindow. Upewnij się, że kursor jest poprawnie zainicjowany przed korzystających z niego dane

jestem pomylony przez to zachowanie SQLiteCursor, może ktoś mi pomoże, że jest to prawda, czy robię coś źle? Mogę podać kod, jeśli jest to wymagane.

Dzięki.

+1

Jakie jest twoje pytanie? –

+0

Proszę zobaczyć moje pytanie teraz. –

Odpowiedz

3

getColumnIndex() jest wielkość liter:

Nazwa kolumny w DB było: Zasady

cursor.getColumnIndex ("Zasady") // workes porządku

kursor.getColumnIndex („zasady”) // wyrzuca błąd, zobacz szczegóły błędu

+4

Nie mogę sobie wyobrazić, dlaczego na Ziemi nie normalizowaliby nazw kolumn, aby nie były rozróżniane wielkości liter. Sam SQL nie dba o sprawę, dlaczego powinien kursor? – nobre

+0

niektóre informacje o "dlaczego" tutaj: https://code.google.com/p/android/issues/detail?id=42636 –

1

Najlepszym i zalecanym podejściem przy użyciu SQLite jest zadeklarować całą swoją nazwę tabeli i nazwę kolumny static, final i class poziom .. na przykład:

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

więc zaletą tego podejścia jest to, don” • Należy pamiętać pisownię i etui itp. nazw tabel i kolumn.

kiedy dostęp do dowolnej tabeli lub kolumny po prostu użyć tych zmiennych statycznych na przykład:

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

podczas odpytywania:

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

czy może on być stosowany w Cursor

int index = cursor.getColumnIndex(COLUMN_MESSAGE); 

to pomoże ci uniknąć takich konfliktów wrażliwości na przypadki i błędów ortograficznych. :)

+0

Wielkie dzięki. Ale właściwie nie tworzę bazy danych za pomocą kodu. Potrzebuję użyć istniejącej bazy danych. Dlaczego tego potrzebuję? ponieważ ma pewne domyślne dane. Próbowałem różnych metod "dostarczania bazy danych z pewnymi domyślnymi danymi" i uznałem, że jest to najlepszy sposób na utworzenie bazy danych z danymi domyślnymi. –

+0

następnie musisz przejrzeć bazę danych i zobaczyć raz nazwę tabeli i kolumny, a następnie użyć ich zmiennych :) –

1

Innym sposobem byłoby zapytanie do bazy danych sam dla prawidłowej nazwy za pomocą PRAGMA table_info, Więc napisałem metodę tylko, że:

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

wtedy wszystko, co trzeba nazwać to:

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

i tak, wiem, że trudno będzie w bazie danych. Ale działa i jest stabilny