2016-02-24 3 views
1

Я создаю проект Android, и у меня есть класс «DBFunc», который имеет несколько методов для обработки запросов, вызванных действиями.SQLiteException: нет такого столбца: категория, но столбец существует

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 для SQLite»

enter image description here

Я действительно надеюсь, что есть простое решение, потому что я не понимаю, почему это не будет работать,

Благодаря

EDIT 1:

@CL попросил код, который создает базу данных. База данных создается в командной строке sqlite3 и передается в программу. Но запрос я использовал

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

EDIT 2:

Я сделал то, что мотивационные @Uwe Partzsch и использовали LIKE вместо ' '

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

Но теперь я получаю другое погрешность

no such table: questions

EDIT 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()); 
     } 
    } 
... 
+0

Вы добавили столбец категории после создания таблицы вопросов? Вы можете удалить приложение и установить новую копию, потому что все выглядит хорошо. – Inducesmile

+0

Удалите приложение и установите его снова. – Rohit5k2

+0

удалил приложение и снова запустил его. по-прежнему такая же ошибка – healyj36

ответ

0

Возможно, вы добавили столбец категории последнего и пытаться переустановить после внесения изменений.

Либо делать четкие данные Настройки> приложения> your_app и launc

или

Удалите приложение, а затем установить снова.

+0

попробовал, что Rohit5k2 сказал, но все еще не работает – healyj36

0

Удалите данные приложения, также вы можете попробовать LIKE вместо '='.

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

Это лучше, хотя теперь у меня другая ошибка. «нет такой таблицы: вопросы» – healyj36

+0

Кажется, вы не создали свои таблицы. Вы можете показать свою инструкцию SQL для создания таблицы? –

1

Это может, существует 2: Каковы возможности

  1. Эта проблема может произошло от нарушенной SQLite схемы.

Ваш вопрос не о проблеме SQL-запроса. но многие разработчики могут подумать о проблеме SQL Statement по вашему вопросу.

В этом случае вы не можете проверять необработанные данные в файле базы данных. Хотя вы не можете использовать поля select и sql where where по имени поля.

В результате вы не можете использовать файл базы данных в своем коде Android.

Точно решение, я рекомендую воссоздать SQLite DB файл, шаг за шагом.

Вы должны сделать резервную копию перед использованием инструмента модификации SQLite. (SQLite Manager, Browser, другие инструменты управления db)

  1. Эта проблема возникла из ваших постоянных данных.

Если вы используете один и то же имя файла для активов или необработанных данных при запуске с измененными данными,

вы можете попробовать удалить предыдущую установленную программу для обновления.

Смежные вопросы