Android SQLite проверка, если таблицы содержат строки - PullRequest
3 голосов
/ 04 октября 2011

Итак, я работаю над игрой для Android, и в настоящее время я застрял на кнопке «Загрузить игру» в главном меню.Эта кнопка вызывает методы, которые читают данные из базы данных и записывают их в класс ресурсов, из которого будут доступны эти данные.

Проблема: Я хочу отключить кнопку загрузки, еслив таблицах нет строк, что означает, что сохранение не существует.

Для этого я использовал следующий метод:

public boolean checkForTables(){
    boolean hasTables;
    String[] column = new String[1];
    column[0] = "Position";
    Cursor cursor;
    cursor = db.query("itemtable", column, null, null, null, null, null);
    if(cursor.isNull(0) == true){
        hasTables=false;
    }else{
        hasTables=true;
    }
    return hasTables;

Как вы можете видеть, он запускает запрос на одном изтаблицы базы данных и проверяет, является ли нулевой столбец, который является единственным в этом курсоре, нулевым.ATM Я не могу проверить результаты logcat по этому вызову, потому что у меня, кажется, есть некоторые проблемы с ним, но кажется, что запрос выдает исключение, потому что таблица пуста.

Любая идея проверить таблицы на наличие строк?

_ __ _ __ _ __ _ __ _ __ _ __ _ _EDIT_ _ __ _ __ _ __ _ __ _

ПРИМЕЧАНИЕ. Я проверил базу данных, и она точно пуста

Хорошо, я использовал rawQuery для таблицы, но подход с подсчетом-statement выдал ошибку, поэтому я использую

public boolean checkForTables(){
        boolean hasTables;

        Cursor cursor = db.rawQuery("SELECT * FROM playertable", null);

        if(cursor.getCount() == 0){
            hasTables=false;
        if(cursor.getCount() > 0){
            hasTables=true;
        }

        cursor.close();
        return hasTables;
    }

Я использую этот метод, чтобы решить, следует ли отключить кнопку loadGame, которая выглядит следующим образом:

loadGame = (ImageButton) findViewById(R.id.loadButton);
    loadGame.setEnabled(databaseAccess.checkForTables());
    loadGame.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            databaseAccess.loadPlayer();
            databaseAccess.loadItems();
            databaseAccess.dropTables();

        }
    });

Таким образом, если checkForTables получает количество строк! = 0, оно вернет true и, следовательно, включит кнопку или отключит ее, если rowcount = 0

Забавно, хотя таблицы пустые, checkForTables () возвращает true, потому что getCount () кажетсяустановите значение! = 0 - я просто не понимаю.

Ответы [ 4 ]

16 голосов
/ 04 октября 2011

Выполните запрос, например select count(*) from itemtable.Этот запрос даст вам один целочисленный результат, содержащий количество строк в этой таблице.

Например:

Cursor cursor = db.rawQuery("SELECT count(*) FROM itemtable");
if (cursor.getInt(0) > 0) ... // there are rows in the table

-------------------------------------------------------------------------------------

Обратите внимание, что @PareshDudhat предпринял попытку следующего редактирования, но рецензенты отклонили его.Я не поспевал за Android с тех пор, как был опубликован этот ответ, но очень краткое исследование предлагает изменить (по крайней мере, изменение в том, как называется rawQuery(), я не проверял moveToFirst(), но комментарий @ k2col подсказываетэто необходимо и сейчас) имеет свои достоинства.

Cursor cursor = db.rawQuery("SELECT count(*) FROM itemtable",null);
cursor.moveToFirst();
if (cursor.getInt(0) > 0) ... // there are rows in the table
3 голосов
/ 04 октября 2011

cursor.getCount()

возвращает количество строк в таблице базы данных.

, а затем попробуйте

Toast.makeText(this,""+cursor.getCount(),Toast.LENGTHLONG).show();

, и это даст вамколичество строк в таблице базы данных

3 голосов
/ 04 октября 2011

То, что говорит Мах, сработает.Другой подход, который вы можете использовать в вашей текущей функции:

hasTables = cursor.moveToFirst());

Обратите внимание, что этот подход, вероятно, лучше использовать, только если вы планируете использовать результаты запроса, если hasTables на самом деле истинно.

Кроме того, не забудьте закрыть курсор, когда закончите!

РЕДАКТИРОВАТЬ

Я не знаю, является ли это вашей проблемой, но при редактировании вы запрашиваете все элементы из playerTable вместо itemTable, как вы это делали впредварительное редактирование.Это твоя проблема?

0 голосов
/ 19 марта 2015

Принятый ответ поставил меня на правильный путь, но не скомпилировал, потому что сигнатура метода rawQuery изменилась, и курсор не был перемещен в первую строку перед чтением.

Вот мое решение, которое включает обработку ошибок и закрывает курсор:

public static boolean isEmpty() {

    boolean isEmpty;
    Cursor cursor = null;
    try {
        cursor = db.rawQuery("SELECT count(*) FROM itemtable", null);

        if (cursor.moveToFirst()) {
            isEmpty = cursor.getInt(0) == 0;
        } else {
            // Error handling here
        }
    } catch (SQLException e) {
        // Error handling here
    } finally {
        cursor.close();
    }
    return isEmpty;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...