有什麼方法可以識別Android遊標中列的數據類型。遊標對象有許多方法來獲取列名,列值。在SQLite中識別列的數據類型Android遊標
我想找出列(TEXT,INTEGER)等的SQLite的數據類型...
我正在寫一個通用的函數來分析光標和執行操作。我只會得到一個sql字符串作爲函數的參數。
有什麼方法可以識別Android遊標中列的數據類型。遊標對象有許多方法來獲取列名,列值。在SQLite中識別列的數據類型Android遊標
我想找出列(TEXT,INTEGER)等的SQLite的數據類型...
我正在寫一個通用的函數來分析光標和執行操作。我只會得到一個sql字符串作爲函數的參數。
每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()調用的結果,則失敗。
您應該使用meta data從SQLite數據庫:
http://developer.android.com/reference/java/sql/ResultSetMetaData.html
您通過一個ResultSet的getMetaData使用()得到這個項目()。
所以,它不是使用android系統中,你將使用SQLite數據庫的常用方法,但通常的JDBC方式:
問候, 斯特凡
感謝斯特凡,我目前使用從SQLiteDatabase.rawQuery方法返回的Android遊標對象(android.database.cursor)。我應該使用什麼過程來獲取ResultSet。一直在尋找,但沒有找到連接到數據庫並獲得結果集的方法。 – Arun 2011-06-09 13:27:43
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
但我讀過,JDBC不支持谷歌。建議使用JDBC還是內置的android.sqlite對象? – Arun 2011-06-09 14:02:10
答案或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"));
這適用於所有Android版本(API)? – IgniteCoders 2016-09-30 21:09:46
我還不測試,但是,嘗試使用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;
}
謝謝尼克,這是一個非常整潔的想法。但是你認爲使用JDBC的結果集也可以使用嗎?我一直在閱讀,谷歌不支持JDBC。 – Arun 2011-06-10 02:43:14
可能 - 我沒有確定的答案,我很害怕。但是,你仍然從錯誤的角度來解決這個問題。正如我所說的,SQLite列沒有真正的數據類型,它是具有該類型的列中的值。 所以你可以有三行和一列「富」,在第1行的內容看起來像文本,在第2行看起來像一個int,在第3行的內容看起來像一個二進制blob。該列的數據類型將無濟於事。 也許你可以修改你的問題,提供更多關於你實際嘗試實現的信息,我可以建議一個合適的解決方案。 – Nik 2011-06-11 10:34:02
有關更多信息,請參閱http://stackoverflow.com/questions/5896348/to-get-resultset-from-pre-complie-statement-in-android/7270433#7270433。 – 2011-09-02 06:30:05