2012-08-02 69 views
1

我已经花了最近几天有这个问题。我已经阅读了这里的所有类似问题,并咨询了大量教程,尽管一切看起来都很合适,但我的程序仍然崩溃。Android SQL崩溃 - 没有这样的列

这里是在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); 

这里就是我宣布我的专栏,并创建我的数据库(我没有为_id的声明,因为我RemindersTableMetaData实现BaseColumns)代码:

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

问题是否已解决:只是为了讲清楚谁比谁可能会遇到这个问题:什么HAPP ened是我很困惑如何使用方法

​​

sortOrder参数。我认为这就像一个脚本命令。例如,您会传递LOW_TO_HIGH或其他内容,并会相应地对结果进行排序。是的,我有时候是个白痴。你实际想要传入的是一个列名,它将用于对游标中返回的行进行排序。无论如何,我传入了一个名为“modified”的字符串,该字符串不是一个声明的列名,因此程序崩溃了。我一直认为这是我设置数据库的方式出了问题,一直以来都是我忘记了这件看似微不足道的事情。这就是人生。感谢大家的帮助。

+0

你有一个崩溃的地方吗? – gkris 2012-08-02 15:39:02

+2

您按语句的顺序引用了一个不存在的列。 – Mat 2012-08-02 15:39:40

+0

是啊,什么是“修改” – javajavajava 2012-08-02 15:41:13

回答

0

只是为了讲清楚谁比谁可能会遇到这个问题:发生了什么事是我糊涂就如何sortOrder参数的方法

​​

被使用。我认为这就像一个脚本命令。例如,您会传递LOW_TO_HIGH或其他内容,并会相应地对结果进行排序。是的,我有时候是个白痴。你实际想要传入的是一个列名,它将用于对游标中返回的行进行排序。无论如何,我传入了一个名为“modified”的字符串,该字符串不是一个声明的列名,因此程序崩溃了。我一直认为这是我设置数据库的方式出了问题,一直以来都是我忘记了这件看似微不足道的事情。这就是人生。感谢大家的帮助。

0

尝试卸载你的设备/仿真器的应用程序,这可能是因为当时有没有修改的列数据库中创建的情况下...

编辑:

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

我试过用adb shell。它成功地删除了数据库。数据库被重新创建后,但问题仍在发生。 – Blighty 2012-08-02 15:57:26

+0

编辑更多的代码后查看... – Ferdau 2012-08-02 16:02:42

+0

我得到了答案。看我上面的评论马特。当然,你是对的,但我错误的产生是由于我的错误想法。我从来没有打算将“修改”定义为一列。这是由于教程中的副本与我对如何工作的无知相结合。 – Blighty 2012-08-02 17:02:41

0

您通过的变量projection或者甚至您的对应表格大多可能没有modified作为列。