SQLiteException:没有这样的列:category,但是列确实存在

时间:2016-02-24 18:03:15

标签: android sqlite android-sqlite

我正在创建一个Android项目,我有一个“DBFunc”类,它有多个方法来处理活动调用的查询。

DBFunc.java

public int getTotalNumberOfQuestions (String table, String category) {
    String selectQuery = "SELECT COUNT(*) FROM " + table + " WHERE category='" + category + "'";
    // example 
    // SELECT COUNT(*) FROM questions WHERE category='History';

    SQLiteDatabase database = this.getReadableDatabase();
    Cursor c = database.rawQuery(selectQuery, null);
    int ans = -1; // returns -1 if query unsuccessful
    if (c.moveToFirst()) {
        ans = c.getInt(0);
    }

    database.close();
    c.close();

    return ans;
}

我在光标上收到错误,说

android.database.sqlite.SQLiteException: no such column: category (code 1): , while compiling: SELECT COUNT(*) FROM questions WHERE category='Physics'

但我的问题表中确实有一个类别列

在命令提示符下通过sqlite3运行此查询时,它可以工作并返回一个数字(例如1)

以下是“DB Browser for SQLite”

中架构的样子

enter image description here

我真的希望有一个简单的解决方案,因为我不明白为什么它不起作用,

由于

编辑1:

@CL要求提供创建数据库的代码。数据库在sqlite3命令行中创建并传递到程序中。但我使用的查询是

CREATE TABLE questions (questionId INTEGER PRIMARY KEY AUTOINCREMENT, question TEXT, option1 TEXT, option2 TEXT, option3 TEXT, option4 TEXT, category TEXT);

编辑2:

我做了@Uwe Partzsch sugested并使用LIKE代替' '

String selectQuery = "SELECT * FROM " + table + " WHERE category LIKE '" + category + "'";

但现在我收到了不同的错误

no such table: questions

编辑3:

public class DBFunc extends SQLiteOpenHelper {
    public static String DB_PATH ="/data/data/com.example.healyj36.quizapp/databases/";

    public static String DB_NAME = "questions.db";
    public static final int DB_VERSION = 1;
    public static final String TB_NAME1 = "questions";
    public static final String TB_NAME2 = "answers";

    private SQLiteDatabase myDB;
    private Context context;

    public DBFunc(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.context = context;
    }

    //Copy database from source code assets to device
    public void copyDataBase() throws IOException {
        try {
            InputStream myInput = context.getAssets().open(DB_NAME);
            String outputFileName = DB_PATH + DB_NAME;
            OutputStream myOutput = new FileOutputStream(outputFileName);

            byte[] buffer = new byte[1024];
            int length;

            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            myOutput.flush();
            myOutput.close();
            myInput.close();
        } catch (Exception e) {
            Log.e("tle99 - copyDatabase", e.getMessage());
        }
    }

    public void createDatabase() throws IOException {
        this.getReadableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            Log.e("tle99 - create", e.getMessage());
        }
    }
...

3 个答案:

答案 0 :(得分:1)

这可能存在2种可能性:

  1. SQLite架构损坏可能会导致此问题。
  2. 您的问题与SQL语句问题无关。但是很多开发人员可以认为SQL Statement有关你问题的问题。

    此案例可以检查数据库文件中没有损坏的数据。虽然您不能使用select字段和sql where子句字段名称。

    因此,您无法在Android代码中使用数据库文件。

    完全解决方案,我建议一步一步地重新创建SQLite DB文件。

    在使用SQLite修改工具之前必须备份。 (SQLite Manager,浏览器,其他数据库管理工具)

    1. 您的持久数据发生此问题。
    2. 如果在使用修改后的数据运行时对资产或原始数据使用相同的文件名,

      您可以尝试卸载以前安装的应用以进行刷新。

答案 1 :(得分:0)

可能您已经添加了类别列后者并尝试在修改后重新安装。

从“设置”> app> your_app和launc

执行清晰数据

卸载应用程序,然后重新安装。

答案 2 :(得分:0)

删除您的应用数据,您也可以尝试LIKE而不是' ='。

String selectQuery = "SELECT * FROM " + table + " WHERE category LIKE '" + category + "'";