Подтвердить что ты не робот

Как я могу проверить, есть ли в моей таблице sqlite данные?

ИЗМЕНИТЬ, Немного изменил код на основе ответов ниже, но до сих пор не работал. Я также добавил сообщение журнала, чтобы сообщить мне, возвращалось ли getCount > 0, и это было так, поэтому я понимаю, что что-то может быть неправильным с моим запросом? или мое использование курсора.

Я создал таблицу, и я хочу проверить, является ли ее пустой или нет, если она пуста, я хочу запустить некоторые инструкции вставки (которые хранятся в массиве).

Ниже мой код, в то время как у меня нет ошибок, когда я вытаскиваю файл .db, я вижу, что он не работает. Как вы подходите к этой проблеме?

public void onCreate(SQLiteDatabase db) {
        Log.i("DB onCreate", "Creating the database...");//log message
        db.execSQL(createCATBUDTAB);
        db.execSQL(createTWOWEETAB);
        try{
            Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
        if (cur.getCount() > 0){
            Log.i("DB getCount", " getcount greater than 0");//log message
            //do nothing everything as it should be
        }
        else{//put in these insert statements contained in the array
            Log.i("DB getCount", " getcount less than 0, should read array");//log message
            for(int i=0; i<13; i++){
                db.execSQL(catInsertArray[i]);
            }
        }
        }catch(SQLiteException e){System.err.println("Exception @ rawQuery: " + e.getMessage());}
    }

Извините, если это довольно глупый вопрос или подход, я новичок во всем этом. Любые ответы очень ценятся!

4b9b3361

Ответ 1

Запрос SELECT COUNT(*) в существующей таблице никогда не должен возвращать значение null. Если в таблице нет строк, она должна возвращать одну строку, содержащую нулевое значение.

И наоборот, строка с ненулевым значением указывает, что она не пуста.

В обоих случаях должна быть возвращена одна строка, что означает, что она всегда будет проходить через

//do nothing everything as it should be

раздела.

Чтобы исправить это, оставьте свой запрос как есть (вы не хотите делать select column_name просто потому, что это было бы лишним и, возможно, немного неэффективным). Оставьте его как SELECT COUNT(*), который всегда будет возвращать одну строку и использовать следующий код (проверяйте только в моей голове, будьте осторожны):

Cursor cur = db.rawQuery("SELECT COUNT(*) FROM CAT_BUD_TAB", null);
if (cur != null) {
    cur.moveToFirst();                       // Always one row returned.
    if (cur.getInt (0) == 0) {               // Zero count means empty table.
        for (int i = 0; i < 13; i++) {
            db.execSQL (catInsertArray[i]);
        }
    }
}

Ответ 2

rawQuery возвращает объект Cursor, который помещается перед первой записью (см. подробнее здесь) SELECT COUNT(*) всегда будет возвращать результат (учитывая, что таблица существует)

Итак, я бы сделал:

if (cur != null){
    cur.moveToFirst();
    if (cur.getInt(0) == 0) {
      // Empty 
    }

}

Ответ 3

Как сказал paxdiablo, курсор не будет пустым. Что вы можете сделать, попробуйте вот так:

if (cur != null && cur.getCount() > 0){
     // do nothing, everything as it should be
}

ИЗМЕНИТЬ

На самом деле я использовал db.query(), и это сработало для меня. Я сделал это.

cursor = db.query(TABLE_NAME, new String[] { KEY_TYPE }, null, null, null, null, null);
if (cursor != null && cursor.getCount() > 0)
{
   retVal = true;
}

TABLE_NAME - моя таблица, а KEY_TYPE - мое имя столбца

Ответ 4

вы имеете в виду, если у него есть право записи? Я пробовал это, и для меня это работает

    dbCur = db.rawQuery("select * from player", null);
    Log.e("a", ""+dbCur.getCount());

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

Ответ 5

Вы можете проверить его вручную:

  • Перейдите в DDMS в Проводнике. /data/data/(your application package)/databases Здесь вы получите файл базы данных. И если вы хотите увидеть вставленные значения в таблице.

  • Скопируйте файлы adb, aapt, AdbWinApi.dll и AdbWinUsbApi.dll из папки platform_tools в папку tools.

  • Тогда Откройте "Командная строка" и укажите путь к каталогу "Инструменты", где существует ваша установка для Android. Он выглядит так: - (Local Drive):\Android\android-sdk-windows\tools

  • После заданного пути вы будете писать команду "adb shell" без кавычек. E:\Developers\Android\android-sdk-windows\tools> adb shell

  • Нажмите Enter и напишите путь DDMS, указанный выше: - # sqlite3 /data/data/(Your Application Package)/databases/name of database

  • Нажмите Enter sqlite>.tables

  • Нажмите "Enter", и вы получите все имя таблицы, существующее в этой базе данных.

sqlite> Select * from table name

Все данные в этой таблице будут показаны.

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

Ответ 6

Мой способ проверки был примерно таким:

Cursor cursor = db.query(DbHelper.DB_NAME,DbHelper.DB_C_ID_ONLY,null,null,null,null,null);
if(cursor.isAfterLast())

Я получаю записи _id, которые в моем случае являются автоинкрементами. Если БД пуста, то isAfterLast вернет true.

Ответ 7

Как насчет этого запроса?

SELECT CASE WHEN EXISTS (SELECT * FROM CAT_BUD_TAB) THEN 1 ELSE 0 END

Это немного быстрее, чем SELECT COUNT(*).

P.S. Проверено на таблицах с 9 миллионами строк.

Ответ 8

Другой альтернативой уже упомянутой будет использование функции  queryNumEntries из класса DatabaseUtils.

Пример может быть следующим:

public boolean checkEmpty(SQLiteDatabase db, String table){
        return DatabaseUtils.queryNumEntries(db, table) == 0;
}

Ответ 9

Вот что я сделал...

Cursor cur = db.rawQuery("SELECT count(*) FROM " + SQLHelper.TABLE_CART, null);
if (cur != null && cur.moveToFirst() && cur.getInt(0) > 0) {
    Log.i(getClass().getName(), "table not empty");
} 
else {
    Log.i(getClass().getName(), "table is empty");
}

Ответ 10

Мое приложение рушилось, пробовав вышеуказанные коды, поэтому я сделал это, и теперь он отлично работает!

public boolean checkIfEmpty()
{
    Cursor cursor = getDatabase().query(DatabaseHelper.Products.TABLE,
            DatabaseHelper.Products.COLUMNS, null, null, null, null, null);

    if (cursor != null)
    {
        try
        {
            //if it is empty, returns true.
            cursor.moveToFirst();
            if (cursor.getInt(0) == 0)
                return true;
            else
                return false;
        }

        //this error usually occurs when it is empty. So i return true as well. :)
        catch(CursorIndexOutOfBoundsException e)
        {
            return true;
        }

    }
    return false;
}

Ответ 11

Используйте это:

public Boolean doesRecordExist(String TableName, String ColumnName, String ColumnData) {
    String q = "Select * FROM "+TableName+" WHERE "+ColumnName+"='"+ColumnData+"';";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(q, null);
    if (cursor.moveToFirst()) {
        return true;
    } else {
        return false;
    }
}


Пример
if (doesRecordExist("student", "name", "John") == true)
 {
 //Do Something
 } else { //Do something
 }

Изменить это в соответствии с вашим использованием:

String q = "Select * FROM "+TableName+" WHERE "+ColumnName+"='"+ColumnData+"';";

Ответ 12

public boolean isEmpty(String TableName){

SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 0;
}