java - Android sqlite - "No such table"而表存在

标签 java android sqlite android-sqlite

我编写了一个 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 表确实存在(我用数据库查看器验证了它)。

如果是这样,我想可能存在一些语法问题...但我找不到它。

关于此问题的其他问题 建议该代码引用了不同的数据库,或者不是最新的数据库。我不认为这是问题所在,因为我试图从头开始删除并重新创建数据库。我之前也使用过相同的代码模式,没有任何问题......

如果是这样,还有什么可能导致此问题?

创建表代码

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 工作得很好......

编辑2

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 因为它不存在 那里。因此,我不得不创建一个临时的新“表”- E1,并改用它。

关于java - Android sqlite - "No such table"而表存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034898/

相关文章:

java - java中的接口(interface)数组

java - 我正在尝试从链接下载图像并将其显示在 ImageView 中,但行 imgView.setImageBitmap(myImg);抛出一些错误

java - 用Java画一个圆

php - 如何使用 Volley Android Studio 将数组插入 MySQL

perl - 使用 Perl 解压缩 LZ4 blob

java - 如何正确停止ServerSocket线程?关闭套接字失败

安卓错误 : thread exiting with uncaught exception (group=0x40015560)

android - 如何使用 Robotium 单击微调器中的第一项?

delphi - 将数据库复制到受限客户端

windows - 静态链接 SQLite 与 DMD (Windows x86)