Определение типа данных столбца в курсоре Android SQLite - PullRequest
10 голосов
/ 09 июня 2011

Есть ли способ идентифицировать тип данных столбца в курсоре в Android. У объекта курсора есть несколько методов для получения имени столбца, значения столбца.

Я хочу узнать тип данных столбца SQLite (TEXT, INTEGER) и т. Д. *

Я пишу универсальную функцию для разбора курсора и выполнения операций. Я получу только строку sql в качестве аргумента функции.

Ответы [ 4 ]

8 голосов
/ 09 июня 2011

Согласно документации SQLite (http://www.sqlite.org/datatype3.html) столбцы в SQLite не имеют тип данных - значения в этих столбцах имеют.

Любой столбец в базе данных SQLite версии 3,кроме столбца INTEGER PRIMARY KEY, может использоваться для хранения значения любого класса хранения.

Если вы используете 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 (), который объединил две или более таблиц.

5 голосов
/ 20 февраля 2012

Ответ или 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"));
2 голосов
/ 22 сентября 2017

Я еще не тестировал, но попробуйте использовать 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;
}
1 голос
/ 09 июня 2011

Вы должны использовать метаданные из базы данных sqlite:

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

Этот элемент можно получить с помощью getMetaData () в ResultSet ().

Итак, это не обычный способ использования базы данных sqlite в android, который вы будете использовать, а обычный способ JDBC:

  1. получить соединение (через менеджер драйверов getConnection)
  2. получить инструкцию (через connection.createStatement)
  3. получить результирующий набор (через Statement.executeQuery)
  4. получить метаданные (через resultset.getMetaData)

С уважением, Стефан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...