1

そのため、単語の SQL データベースのセットアップに取り組んできましたが、デバッグ ログからわかる限り、実際には適切にロードおよびセットアップされています。ただし、セットアップ中か既に完了しているかに関係なく、クエリを実行しようとすると、例外のためにプログラムが強制的に閉じられます。ログを調査すると、次のことがわかります。

07-12 13:47:02.000: W/dalvikvm(5247): threadid=1: thread exiting with uncaught exception
(group=0x40a401f8)
...
07-12 13:47:02.010: E/AndroidRuntime(5247): Caused by:
android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException: bind or column index out of
range: handle 0x14a6548
...
07-12 14:41:36.250: E/AndroidRuntime(6326):     at com.example.wordsearchandroid.WordListProvider.query(WordListProvider.java:70)

Android API で SQLiteBindOrColumnIndexOutOfRangeException を検索すると、かなり... 質素なページ (http://developer.android.com/reference/android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException.html) が明らかになり、「ハンドル」が参照するものについては何も言及されていません。 .

残念ながら、私の知る限り、存在しない列を参照しているクエリはありません。これは、ContentProvider のクエリ メソッドです。

public class WordListProvider extends ContentProvider {
private WordListOpenHelper listOpenHelper;
....

public static final String ID = "_ID";
public static final String WORD = "WORD";
public static final String LENGTH = "LENGTH";
...

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
    qBuilder.setTables(DB_NAME);
    Cursor c;

    switch(matcher.match(uri)) {

        case SEARCH_WORD_LIST:

            Log.d("WORDLISTPROVIDER", "Entered Search");
            c = qBuilder.query(listOpenHelper.getReadableDatabase(), projection, null,
                    selectionArgs, null, null, null);
            Log.d("WORDLISTPROVIDER", "Query Completed");
            if (c == null)
                return null;
            c.setNotificationUri(getContext().getContentResolver(), uri);
            break;

            default:
                Log.d("WORDLISTPROVIDER", "Default Entered");
                throw new IllegalArgumentException("Unknown URI " + uri);

    }
    Log.d("WORDLISTPROVIDER", "Exited Search");
    return c;
}

^行で例外が発生します

c = qBuilder.query(listOpenHelper.getReadableDatabase(), projection, null,
                    selectionArgs, null, null, null);

参考までに、この特定の呼び出しのプロジェクションと selectionArgs 文字列を設定する方法を次に示します。

String[] proj = {
            WordListProvider.ID,
            WordListProvider.WORD
    };
String[] selectionArgs = {""};

そして、これが私のデータベースのビルダーで、WordListProvider の内部クラスです。

private static class WordListOpenHelper extends SQLiteOpenHelper {

    private SQLiteDatabase wordDb;
    private Context helperContext;

    private static final String WORD_LIST_CREATE = "CREATE TABLE "+ DB_NAME  +
            " ( " +
             ID +  " INTEGER PRIMARY KEY, " +
             WORD + " TEXT, " +
            LENGTH + " INTEGER " +
            ");";

    WordListOpenHelper(Context context) {
        super(context, "wordlist", null, 1);
        helperContext = context;
        Log.d("OPENHELPER", "Constructed");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d("OPENHELPER", "Creating");
        wordDb = db;
        Log.d("OPENHELPER", "DB set");
        wordDb.execSQL(WORD_LIST_CREATE);
        Log.d("OPENHELPER", "SQL Execed");
        loadWordList();
    }

    private void loadWordList() {
        new Thread(new Runnable() {
            public void run() {
                try {
                    loadWords();
                } catch (IOException e) {
                    Log.d("OPENHELPER", "Exception Caught");
                    throw new RuntimeException(e);
                }
            }
        }).start();
    }

    private void loadWords() throws IOException {
        ...
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        ...
    }



}

loadWords は最終的に終了しますが、テーブルの読み込みが終了したかどうかにかかわらず、例外が発生します (テーブルの読み込みが終了していない場合があり、例外が発生し、プログラムが終了します。その後、テーブルの読み込みが終了します)。また、私の列名は一貫しており、少なくとも外見上は一貫しているように見えます.また、クエリへの射影のために null (別名、すべての行を返す) を渡した場合でも例外が発生します。例外の原因、またはハンドルの意味について何か考えがある人はいますか?

4

1 に答える 1

4

プロバイダーで次の行を確認してください。

c = qBuilder.query(listOpenHelper.getReadableDatabase(), projection, null,
                    selectionArgs, null, null, null);

選択パラメーターなしで selectionArgs を使用します。null 以外の selectionArgs を渡すと、選択引数をバインドできる場所がないため、クエリは失敗します。

この行は次のようになります。

 c = qBuilder.query(listOpenHelper.getReadableDatabase(), projection, selection,
                        selectionArgs, null, null, null);

選択せずに selectionArgs を使用することはできないため、null代わりに渡すようにしてください

String[] selectionArgs = {""};
于 2012-07-12T19:03:56.637 に答える