10

Android で SQLiteCursor を使用しているときに、getColumnIndex()が大文字と小文字を区別して動作していることを知りました。

例:

DB の列名: ルール

cursor.getColumnIndex("Rules")  //works fine
cursor.getColumnIndex("rules")  //throws error, see the error detail

ドキュメントにはそれについて何も書かれていません。詳細 については、これを参照してください。

LogCat は次のように述べています。

java.lang.IllegalStateException: CursorWindow から行 0、列 -1 を読み取ることができませんでした。カーソルからデータにアクセスする前に、カーソルが正しく初期化されていることを確認してください

のこの振る舞いに混乱していSQLiteCursorます。誰かがこれが本当であるか、または私が何か間違ったことをしていることを教えてもらえますか? 必要に応じてコードを提供できます。

ありがとう。

4

4 に答える 4

5

getColumnIndex() は大文字と小文字を区別します。

DB の列名:ルール

cursor.getColumnIndex(" Rules ") //正常に動作します

cursor.getColumnIndex(" rules ") //エラーをスローします。エラーの詳細を参照してください

于 2012-03-07T15:11:47.430 に答える
2

別の方法は、を使用してデータベース自体に正しい名前を照会することです。そのため、そのため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");

はい、データベースでは難しいことはわかっています。しかし、それは動作し、安定しています

于 2015-04-04T17:02:10.477 に答える
2

SQLite を使用した最適かつ推奨されるアプローチは、すべてのテーブル名、列名staticfinalおよびclassレベルを宣言することです。次に例を示します。

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

これにより、大文字と小文字の区別やスペルミスの競合を回避できます。:)

于 2012-01-27T06:49:01.973 に答える