2011-06-09 66 views
8

有什麼方法可以識別Android遊標中列的數據類型。遊標對象有許多方法來獲取列名,列值。在SQLite中識別列的數據類型Android遊標

我想找出列(TEXT,INTEGER)等的SQLite的數據類型...

我正在寫一個通用的函數來分析光標和執行操作。我只會得到一個sql字符串作爲函數的參數。

回答

6

每SQLite的文檔(http://www.sqlite.org/datatype3.html)SQLite中列沒有數據類型 - 在這些列中的值做。

除了INTEGER PRIMARY KEY列,SQLite版本3數據庫中的任何列都可用於存儲任何存儲類的值。

如果您使用API​​等級11或以上,則光標支持getType()(請參閱http://developer.android.com/reference/android/database/AbstractWindowedCursor.html#getType(int))。

如果您使用的是較早的API級別,而你知道,在一個給定的光標來自同一個表中的所有結果,那麼你可以這樣做(未經測試):

// Assumes "cursor" is a variable that contains the cursor you're 
// interested in. 

String tableName = "..."; // The name of the table 
SQLiteDatabase db = cursor.getDatabase(); 
String[] names = cursor.getColumnNames(); 

for (name : names) { 
    Cursor typeCursor = 
     db.rawQuery("select typeof (" + name + ") from " + tableName; 
    typeCursor.moveToFirst(); 
    Log.v("test", "Type of " + name + " is " + typeCursor.getString(0); 
} 

,但將(我期望)如果傳入的遊標是(例如)連接兩個或更多表的db.rawQuery()調用的結果,則失敗。

+0

謝謝尼克,這是一個非常整潔的想法。但是你認爲使用JDBC的結果集也可以使用嗎?我一直在閱讀,谷歌不支持JDBC。 – Arun 2011-06-10 02:43:14

+0

可能 - 我沒有確定的答案,我很害怕。但是,你仍然從錯誤的角度來解決這個問題。正如我所說的,SQLite列沒有真正的數據類型,它是具有該類型的列中的值。 所以你可以有三行和一列「富」,在第1行的內容看起來像文本,在第2行看起來像一個int,在第3行的內容看起來像一個二進制blob。該列的數據類型將無濟於事。 也許你可以修改你的問題,提供更多關於你實際嘗試實現的信息,我可以建議一個合適的解決方案。 – Nik 2011-06-11 10:34:02

+0

有關更多信息,請參閱http://stackoverflow.com/questions/5896348/to-get-resultset-from-pre-complie-statement-in-android/7270433#7270433。 – 2011-09-02 06:30:05

1

您應該使用meta data從SQLite數據庫:

http://developer.android.com/reference/java/sql/ResultSetMetaData.html

您通過一個ResultSet的getMetaData使用()得到這個項目()。

所以,它不是使用android系統中,你將使用SQLite數據庫的常用方法,但通常的JDBC方式:

  1. 得到(通過驅動程序管理器的getConnection)的連接
  2. 獲取語句(通過connection.createStatement)
  3. 得到一個結果(通過Statement.executeQuery的)
  4. 獲取元數據(通過ResultSet.getMetaData得到)

問候, 斯特凡

+0

感謝斯特凡,我目前使用從SQLiteDatabase.rawQuery方法返回的Android遊標對象(android.database.cursor)。我應該使用什麼過程來獲取ResultSet。一直在尋找,但沒有找到連接到數據庫並獲得結果集的方法。 – Arun 2011-06-09 13:27:43

+0

String url =「jdbc:sqlite:/data/data/app.name/databases/Database」; Class.forName(「SQLite.JDBCDriver」); Connection con = DriverManager.getConnection(url); ResultSet rs = con.createStatement()。executeQuery(sql); con.close(); – Arun 2011-06-09 14:01:18

+0

但我讀過,JDBC不支持谷歌。建議使用JDBC還是內置的android.sqlite對象? – Arun 2011-06-09 14:02:10

5

答案或NiK,都很好。但是如果你的數據庫是空的,這個崩潰。 我建議使用

String Query = "PRAGMA table_info(my_table_name)"; 
Cursor my_cursor = db.rawQuery(Query, null); 
my_cursor.moveToFirst(); 
Column_name = my_cursor.getString(my_cursor.getColumnIndex("name")); 
Column_type = my_cursor.getString(my_cursor.getColumnIndex("type")); 
+0

這適用於所有Android版本(API)? – IgniteCoders 2016-09-30 21:09:46

1

我還不測試,但是,嘗試使用cursor.getType(I)

像這樣:

public static List resultSetToArrayListAndroid(Cursor cursor) throws SQLException { 
    int columns = cursor.getColumnCount(); 
    ArrayList list = new ArrayList(); 
    while (cursor.moveToNext()) { 
     HashMap row = new HashMap(columns); 
     for (int i = 1; i <= columns; ++i) { 
      switch (cursor.getType(i)) { 
       case Cursor.FIELD_TYPE_FLOAT: 
        row.put(cursor.getColumnName(i), cursor.getFloat(i)); 
        break; 
       case Cursor.FIELD_TYPE_INTEGER: 
        row.put(cursor.getColumnName(i), cursor.getInt(i)); 
        break; 
       case Cursor.FIELD_TYPE_STRING: 
        row.put(cursor.getColumnName(i), cursor.getString(i)); 
        break; 
      } 
     } 
     list.add(row); 
    } 
    return list; 
}