2012-08-02 3 views
1

지난 며칠 동안이 문제를 겪었습니다. 나는 비슷한 질문을 모두 읽었을뿐 아니라 수많은 자습서를 참조했으며, 모든 것이 나에게 잘 보이지만 내 프로그램은 여전히 ​​충돌합니다.Android SQL 충돌 - 해당 열 없음

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 번째 줄에있는 비트입니다. 여기

// 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" + ");"; 
라인 (133)은 queryBuilder.query 호출입니다

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 인수가 어떻게 이뤄지는 지 혼란 스러웠다.

이 사용되었다. 나는 이것이 대본 명령과 같다고 생각했다. 예를 들어 LOW_TO_HIGH 또는 무언가를 전달하면 그에 따라 결과가 정렬됩니다. 예, 저는 때때로 바보입니다. 여기서 실제로 전달하고자하는 것은 커서에서 리턴 된 행을 정렬하는 데 사용될 컬럼 이름입니다. 어쨌든, 나는 선언 된 열 이름이 아니며 결과적으로 프로그램이 충돌하는 "수정 된"문자열을 전달하고있었습니다. 저는 제가 데이터베이스를 설정하는 방식에 문제가 있다고 생각 했었습니다. 그리고 그 모든 과정을 거쳐서 내가 잊어 버린 것 같았던 사소한 일이었습니다. 그런 삶입니다. 도움을 주신 모든 분들께 감사드립니다.

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

당신은 결코 :

+0

충돌이있는 코드가 있습니까? – gkris

+2

주문 별 주문 문이 존재하지 않는 열을 참조합니다. – Mat

+0

예, 무엇이 "수정 된" – javajavajava

답변

0

그냥이 문제에 실행할 수있는 다른 사람에게 명확하게하기 위해 ... 여기에 '수정'열을 정의 : 무슨 일이하는 것은 내가에 혼란 하였다 어떻게 방법에 sortOrder 인수

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

이 사용되었다. 나는 이것이 대본 명령과 같다고 생각했다. 예를 들어 LOW_TO_HIGH 또는 무언가를 전달하면 그에 따라 결과가 정렬됩니다. 예, 저는 때때로 바보입니다. 여기서 실제로 전달하고자하는 것은 커서에서 리턴 된 행을 정렬하는 데 사용될 컬럼 이름입니다. 어쨌든, 나는 선언 된 열 이름이 아니며 결과적으로 프로그램이 충돌하는 "수정 된"문자열을 전달하고있었습니다. 저는 제가 데이터베이스를 설정하는 방식에 문제가 있다고 생각 했었습니다. 그리고 그 모든 과정을 거쳐서 내가 잊어 버린 것 같았던 사소한 일이었습니다. 그런 삶입니다. 도움을 주신 모든 분들께 감사드립니다.

0

..., 수정 된 열이 없었다 때 DB가 생성되는 경우가 될 수 장치/에뮬레이터에서 응용 프로그램을 제거

수정을 시도

+0

나는 그것을 adb 쉘을 사용하여 시도했다. 데이터베이스를 성공적으로 제거했습니다. 데이터베이스가 후원자에게 재 작성되었지만 문제는 여전히 발생했습니다. – Blighty

+0

코드를 자세히 살펴본 후 편집 ... – Ferdau

+0

나는 대답을 얻었다. 매트에게 내 위의 코멘트를 참조하십시오. 당신은 물론 맞습니다. 그러나 제 잘못이 오는 방식은 제 생각에 잘못된 생각 때문이었습니다. 나는 "수정 된"컬럼으로 정의 할 생각이 전혀 없었다. 그것은 sortby가 어떻게 작동했는지에 대한 나의 무지와 함께 튜토리얼에서 copypasta에 의한 것이었다. – Blighty

0

귀하가 전달한 변수 projection 또는 해당 테이블도 대부분 modified이 아니 었습니다.

관련 문제