繁体   English   中英

Android sqlite - 表存在时“没有这样的表”

[英]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完美地工作......

编辑 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 ,因为它不存在THERE 所以我不得不创建一个临时的新“表” - E1,并使用它。

有时会出现此问题,解决方案是从设备上卸载您的应用程序,然后重新安装。

解决方案是卸载您的应用程序,然后再次运行。

原因 - 您可能已经更改了 SQLite 类的@Override onCreate()方法。

我们不能通过更改 onCreate 代码来更改 SQLite 的表。 这就是发生在我身上的事情。

**提示 - ** 我们必须删除已经创建的 SQL 数据库才能直接进行更改,或者您可以使用 sql 代码进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM