1

私はこの問題を抱えてここ数日を過ごしました。私はここで同様の質問をすべて読み、多数のチュートリアルを参照しました。すべてが正しく見えても、プログラムがクラッシュします。

これがlogcatです:

08-02 15:13:41.876: D/ReminderProvider(1242): main oncreate called
08-02 15:13:41.984: I/dalvikvm(1242): threadid=3: reacting to signal 3
08-02 15:13:42.074: I/dalvikvm(1242): Wrote stack traces to '/data/anr/traces.txt'
08-02 15:13:42.234: D/ReminderListActivity(1242): onCreate
08-02 15:13:42.406: D/ReminderListActivity(1242): Displaying all the reminders in a list
08-02 15:13:42.474: I/dalvikvm(1242): threadid=3: reacting to signal 3
08-02 15:13:42.524: I/dalvikvm(1242): Wrote stack traces to '/data/anr/traces.txt'
08-02 15:13:42.804: D/gralloc_goldfish(1242): Emulator without GPU emulation detected.
08-02 15:13:43.234: D/ReminderProvider(1242): query
08-02 15:13:43.264: I/SqliteDatabaseCpp(1242): sqlite returned: error code = 1, msg = no such column: modified, db=/data/data/com.corsair.android.taskreminder/databases/reminders.db
08-02 15:13:43.274: W/dalvikvm(1242): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
08-02 15:13:43.374: E/AndroidRuntime(1242): FATAL EXCEPTION: AsyncTask #1
08-02 15:13:43.374: E/AndroidRuntime(1242): java.lang.RuntimeException: An error occured while executing doInBackground()
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.os.AsyncTask$3.done(AsyncTask.java:278)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.lang.Thread.run(Thread.java:856)
08-02 15:13:43.374: E/AndroidRuntime(1242): Caused by: android.database.sqlite.SQLiteException: no such column: modified: , while compiling: SELECT _id, title FROM reminders ORDER BY modified DESC
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:354)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:291)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at com.corsair.android.taskreminder.ReminderListProvider.query(ReminderListProvider.java:133)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.ContentResolver.query(ContentResolver.java:311)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.CursorLoader.loadInBackground(CursorLoader.java:42)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:255)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:55)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
08-02 15:13:43.374: E/AndroidRuntime(1242):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

したがって、存在しない列にアクセスしようとしているとのことです。これは、ReminderListProviderクエリメソッドの133行目からのビットで、エラーが発生していることを示しています。133行目はqueryBuilder.query呼び出しです。

// get the database and run the query
    SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    Cursor cursor = queryBuilder.query(db, projection, selection,
            selectionArgs, null, null, orderby);

列を宣言してデータベースを作成するコードは次のとおりです(RemindersTableMetaDataはBaseColumnsを実装しているため、_idの宣言はありません)。

public static final String REMINDER_TITLE = "title";
public static final String REMINDER_BODY = "body";
public static final String REMINDER_DATE_TIME = "reminder_date_time";

    // script to create database
    public static final String DATABASE_CREATE_SCHEMA = "create table "
            + DATABASE_TABLE_NAME + " (" + RemindersTableMetaData._ID
            + " integer primary key autoincrement, " + REMINDER_TITLE
            + " text not null, " + REMINDER_BODY + " text not null, "
            + REMINDER_DATE_TIME + " text not null" + ");";

クエリ呼び出しの直前に呼び出されるコードは次のとおりです。

String[] uiBindFrom = { RemindersTableMetaData._ID,
            RemindersTableMetaData.REMINDER_TITLE };
    int[] uiBindTo = { R.layout.layout_reminder_list };

    getLoaderManager().initLoader(REMINDER_LIST_LOADER, null, this);

    adapter = new SimpleCursorAdapter(this, R.layout.layout_reminder_row,
            null, uiBindFrom, uiBindTo, 0);

解決した問題:この問題に遭遇する可能性のある他の人に明確にするために:何が起こったのか、メソッドへのsortOrder引数がどのように混乱したか

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {

使われた。これはスクリプトコマンドのようなものだと思いました。たとえば、LOW_TO_HIGHなどを渡すと、それに応じて結果が並べ替えられます。はい、私は時々ばかです。ここで実際に渡したいのは、カーソルで返された行を並べ替えるために使用される列名です。とにかく、宣言された列名ではない「変更された」という文字列を渡していたため、プログラムがクラッシュしていました。データベースの設定方法がおかしいと思っていたのですが、それはずっと忘れていた、一見些細なことでした。それが人生だ。みんなの助けに感謝します。

4

3 に答える 3

0

この問題に遭遇する可能性のある他の人に明確にするために:何が起こったのか私はsortOrderメソッドへの議論がどのように混乱していたか

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {

使われた。これはスクリプトコマンドのようなものだと思いました。たとえば、LOW_TO_HIGHなどを渡すと、それに応じて結果が並べ替えられます。はい、私は時々ばかです。ここで実際に渡したいのは、カーソルで返された行を並べ替えるために使用される列名です。とにかく、宣言された列名ではない「変更された」という文字列を渡していたため、プログラムがクラッシュしていました。データベースの設定方法に問題があると思っていたのですが、それはずっと、私が忘れていた、一見些細なことでした。それが人生だ。みんなの助けに感謝します。

于 2012-08-03T19:03:03.850 に答える
0

デバイス/エミュレーターでアプリをアンインストールしてみてください。変更された列がないときにDBが作成される可能性があります...

編集:

// script to create database
    public static final String DATABASE_CREATE_SCHEMA = "create table "
            + DATABASE_TABLE_NAME + " (" + RemindersTableMetaData._ID
            + " integer primary key autoincrement, " + REMINDER_TITLE
            + " text not null, " + REMINDER_BODY + " text not null, "
            + REMINDER_DATE_TIME + " text not null" + ");";

ここで「変更された」列を定義することはありません。

于 2012-08-02T15:46:30.633 に答える
0

渡した変数projection、または対応するテーブルでさえ、ほとんどの場合modified、列として含まれていませんでした。

于 2017-08-31T06:27:33.593 に答える