2012-01-27 93 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:無法從 CursorWindow逐行讀取0,-1關口。確保光標之前我對SQLiteCursor的這種行爲感到困惑從中

訪問數據正確初始化,有人可以幫助我,這是真的還是我做錯了什麼?如果需要,我可以提供代碼。

謝謝。

+1

那麼你的問題是什麼? – 2012-01-27 06:31:27

+0

請現在看看我的問題。 – 2012-01-27 06:33:34

回答

3

getColumnIndex()是大小寫敏感的:在DB

列名是:規則

cursor.getColumnIndex( 「規則」)// workes精細

光標。getColumnIndex(「規則」)//拋出錯誤,請參閱錯誤詳細

+4

我無法想象爲什麼在地球上他們不正常化列名稱,所以他們將不區分大小寫。 SQL本身並不關心這種情況,爲什麼要使用Cursor? – nobre 2012-07-12 15:12:30

+0

有關'爲什麼'的一些信息:https://code.google.com/p/android/issues/detail?id=42636 – 2014-03-28 09:57:38

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

,或者它可以在光標

int index = cursor.getColumnIndex(COLUMN_MESSAGE); 
使用

這將幫助您避免這種大小寫敏感和拼寫錯誤的衝突。 :)

+0

非常感謝。但實際上我不是使用代碼創建我的數據庫。我需要使用現有的數據庫。爲什麼我需要它?因爲它有一些默認數據。我嘗試了「如何爲數據庫提供一些默認數據」的不同方法,並且我發現它是使用默認數據創建和填充數據庫的最佳方式。 – 2012-01-27 06:57:48

+0

那麼你需要探索數據庫,看到表和列的名稱一次,然後使用它們的變量:) – 2012-01-27 07:01:36

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

是的,我知道這將是艱難的數據庫。但它的工作原理和穩定