[英]Android sqlite - “No such table” while table exist
我编写了一个 SQL 查询来返回项目以显示给用户。
然而,它似乎有一个奇怪的问题。
这是错误:
11-17 13:44:08.644: E/AndroidRuntime(3229): Caused by:
android.database.sqlite.SQLiteException: no such table: events (code 1): , while compiling:
SELECT eventsmeta.*, events.* FROM eventsmeta JOIN
(SELECT events.*, classes.* FROM events JOIN classes ON events.idfortype=classes._id)
ON eventsmeta.eventid=events._id WHERE (eventsmeta.repeat_start = ?) OR
(((? - eventsmeta.repeat_start) % (eventsmeta.repeat_day * 86400000)) = 0) OR
(((? - eventsmeta.repeat_start) % (eventsmeta.repeat_week * 7 * 86400000)) = 0) OR
((((12 - eventsmeta.repeat_start_month + ?) % (eventsmeta.repeat_month)) = 0) AND (eventsmeta.repeat_start_year <= ?))
ORDER BY events.startat ASC;
问题是表events
确实存在(我用数据库查看器验证了它)。
如果是这样,我想有一些语法问题......但我找不到它。
关于此问题的其他问题表明代码引用了不同的数据库,或者不是最新的。 我认为这不是问题,因为我试图从头开始删除并重新创建数据库。 我之前也使用过相同的代码模式,没有任何问题......
如果是这样,还有什么可能导致这个问题?
CREATE TABLE
代码public static final String SQL_CREATE_EVENTS =
"CREATE TABLE IF NOT EXISTS " + Events.TABLE_NAME + " (" +
Events._ID + " INTEGER PRIMARY KEY," +
Events.COLUMN_NAME_EVENT_PRIORITY + " INTEGER," + //
Events.COLUMN_NAME_EVENT_TITLE + " Text," +
Events.COLUMN_NAME_START_AT + " INTEGER," +
Events.COLUMN_NAME_END_AT + " INTEGER," +
Events.COLUMN_NAME_EVENT_NOTES + " Text," +
Events.COLUMN_NAME_EVENT_TYPE + " Text," +
Events.COLUMN_NAME_ID_FOR_TYPE + " INTEGER);";
SQLiteDatabase db = SchooLauncherDbHelper.getInstance(getActivity()).getReadableDatabase();
String sql = SQL QUERY HERE;
Cursor c = db.rawQuery(sql, new String[] {.............});
显然, SELECT * FROM events
完美地工作......
SQLiteOpenHelper
:
public class SchooLauncherDbHelper extends SQLiteOpenHelper {
static SchooLauncherDbHelper mInstance = null;
static final int DATABASE_VERSION = 1;
static final String DATABASE_NAME = "SchooLauncher.db";
String query;
String[] iconFileNames = {};
public static SchooLauncherDbHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new SchooLauncherDbHelper(
context.getApplicationContext());
}
return mInstance;
}
private SchooLauncherDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SchooLauncherContract.SQL_CREATE_SEMESTERS);
db.execSQL(SchooLauncherContract.SQL_CREATE_STUDENTS);
db.execSQL(SchooLauncherContract.SQL_CREATE_SUBJECTS);
db.execSQL(SchooLauncherContract.SQL_CREATE_STUDENTSTUBJECTJOIN);
db.execSQL(SchooLauncherContract.SQL_CREATE_TEACHERS);
db.execSQL(SchooLauncherContract.SQL_CREATE_TEACHERSUBJECTJOIN);
db.execSQL(SchooLauncherContract.SQL_CREATE_CLASSES);
db.execSQL(SchooLauncherContract.SQL_CREATE_TEACHERCLASSJOIN);
db.execSQL(SchooLauncherContract.SQL_CREATE_ASSIGNMENTS);
db.execSQL(SchooLauncherContract.SQL_CREATE_EXAMS);
db.execSQL(SchooLauncherContract.SQL_CREATE_EVENTS);
db.execSQL(SchooLauncherContract.SQL_CREATE_EVENTS_META);
db.execSQL(SchooLauncherContract.SQL_CREATE_SETTINGS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("onUpgrade()", "Upgrading from " + oldVersion + " to "
+ newVersion);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
发现问题了!
我所要做的就是为派生表创建一个别名,并使用它代替events
:
SELECT eventsmeta.*, E1.* FROM eventsmeta JOIN
(SELECT events.*, classes.* FROM events JOIN classes ON events.idfortype=classes._id) AS E1
ON eventsmeta.eventid=E1._id WHERE (eventsmeta.repeat_start = ?) OR
(((? - eventsmeta.repeat_start) % (eventsmeta.repeat_day * 86400000)) = 0) OR
(((? - eventsmeta.repeat_start) % (eventsmeta.repeat_week * 7 * 86400000)) = 0) OR
((((12 - eventsmeta.repeat_start_month + ?) % (eventsmeta.repeat_month)) = 0) AND (eventsmeta.repeat_start_year <= ?))
ORDER BY E1.startat ASC;
我认为问题是我不可能从eventsmeta
表和新的派生表中选择表events
,因为它不存在THERE 。 所以我不得不创建一个临时的新“表” - E1,并使用它。
有时会出现此问题,解决方案是从设备上卸载您的应用程序,然后重新安装。
解决方案是卸载您的应用程序,然后再次运行。
原因 - 您可能已经更改了 SQLite 类的@Override onCreate()
方法。
我们不能通过更改 onCreate 代码来更改 SQLite 的表。 这就是发生在我身上的事情。
**提示 - ** 我们必须删除已经创建的 SQL 数据库才能直接进行更改,或者您可以使用 sql 代码进行更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.