だから私は思っていたことをかなり単純で簡単にしようとしています。私は自分自身を作成したアンドロイドのSqliteデータベースからいくつかのデータをロードしようとしています。唯一の問題は、このエラーが発生することです。Sqliteは既存のタイトルに「無効な列のタイトル」を投げる
W/MainActivity: onCreate started
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
W/NotificationDbHelper: Column in cursor named: _id
W/NotificationDbHelper: Column in cursor named: title
W/NotificationDbHelper: Column in cursor named: additional
W/NotificationDbHelper: Column in cursor named: icon
W/MainActivity: onCreate ended
D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
[ 10-04 09:04:07.090 4272: 4272 D/ ]
HostConnection::get() New Host Connection established 0xad17b6a0, tid 4272
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: dk.simwir.lockscreennotifications, PID: 4272
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.IllegalArgumentException: Invalid column title
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
at android.content.ContentResolver.query(ContentResolver.java:491)
at android.content.CursorLoader.loadInBackground(CursorLoader.java:64)
at android.content.CursorLoader.loadInBackground(CursorLoader.java:56)
at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
テーブルからデータをロードしようとしているとき。主なエラーの継ぎ目は:Caused by: java.lang.IllegalArgumentException: Invalid column title
です。列が無効であると主張していますが、ログ出力に表示されているように、作成された列はそこにあるようです:W/NotificationDbHelper: Column in cursor named: title
。そして、私はAndroidのADBからデータベースにアクセスしても、それが存在することを確認しました:
問題を調査するとき私が見つけた主な「修正」は、私が投影マップに追加するために必要なことでしたしかし私はそれを試みたが、それでもそれを修正しなかった。
エラーは自分のコードで直接発生するようではありませんが、バックグラウンドスレッドで発生するので、ログ出力によってエラーを特定するのが難しくなります。しかし、データベースからの情報は、このコードでロードされます。
Cursor cursor = notificationDbHelper.getAllActiveNotifications();
if(cursor == null){
Log.e(TAG, "Cursor returned null");
Toast toast = Toast.makeText(getApplicationContext(), R.string.cursor_null_error, Toast.LENGTH_LONG);
toast.show();
}else if (cursor.getCount()==0){
Log.e(TAG, "Cursor returned empty");
Toast toast = Toast.makeText(getApplicationContext(), R.string.no_active_notifications, Toast.LENGTH_SHORT);
toast.show();
}else{
String[] fromColumns = {ActiveNotificationEntry.COLUM_NAME_TITLE, ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT};
int[] toViews = {R.id.notification_title, R.id.notification_additional_text};
cursorAdapter = new SimpleCursorAdapter(this, R.id.simple_notification, cursor, fromColumns, toViews, 0);
notificationList.setAdapter(cursorAdapter);
}
データベースと対話getAllActiveNotifications
機能は、次のようになります。
public Cursor getAllActiveNotifications(){
HashMap<String, String> myProjectionMap = new HashMap<String, String>();
myProjectionMap.put(ActiveNotificationEntry._ID, ActiveNotificationEntry._ID);
myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_TITLE, ActiveNotificationEntry.COLUM_NAME_TITLE);
myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT, ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT);
myProjectionMap.put(ActiveNotificationEntry.COLUM_NAME_ICON, ActiveNotificationEntry.COLUM_NAME_ICON);
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(ActiveNotificationEntry.TABLE_NAME);
queryBuilder.setProjectionMap(myProjectionMap);
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = queryBuilder.query(db,CURSOR_COLUMNS, null, null, null, null, null);
if (cursor!=null){
for(int i = 0; i < cursor.getColumnCount(); i++){
Log.w("NotificationDbHelper", "Column in cursor named: " + cursor.getColumnName(i));
}
cursor.moveToFirst();
return cursor;
}else {
Log.e("NotificationDbHelper", "Cursor returned null");
return null;
}
}
カーソルcolums配列は、これを含んでいます
public static final String[] CURSOR_COLUMNS = new String[]{
ActiveNotificationEntry._ID,
ActiveNotificationEntry.COLUM_NAME_TITLE,
ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT,
ActiveNotificationEntry.COLUM_NAME_ICON};
表は、getActiveNotification()と同じファイル内に作成されます。このファイルには、SQLiteOpenHelperを拡張し、作成にこれを持っています
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(NotificationContract.SQL_CREATE_ENTRIES);
}
ここで参照SQL_CREATE_ENTRIES定数は次のとおりです。
public static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + ActiveNotificationEntry.TABLE_NAME + " (" +
ActiveNotificationEntry._ID + " INTEGER PRIMARY KEY" + COMMA_SEP +
ActiveNotificationEntry.COLUM_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
ActiveNotificationEntry.COLUM_NAME_ICON + TEXT_TYPE + COMMA_SEP +
ActiveNotificationEntry.COLUM_NAME_ADDITIONAL_TEXT + TEXT_TYPE + ")";
私が代わりにQueryBuilderの簡単なdatabase.queryを試してみましたが、同じ結果としています:エラーメッセージが、それはこの時点でアクティブ「doInBackground()」が存在すべきではない任意のasynkTasksにあったと言うにもかかわらず
Cursor cursor = db.query(ActiveNotificationEntry.TABLE_NAME, CURSOR_COLUMNS,null,null,null,null,null,null);
。
gistに関連すると思われるすべてのファイルを収集しました。上記のMainActivityからの情報の使用は87行目です。
を行っていますこの前にテーブル作成クエリを実行しましたか?このクエリを投稿できますか? –