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

EDIT, Слегка изменил код, основываясь на ответах ниже, но все еще не получил его. Я также добавил сообщение в журнал, чтобы сообщить мне, возвращает ли 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's 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());}
    }

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

Ответы [ 13 ]

31 голосов
/ 09 декабря 2010

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

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

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

//do nothing everything's 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]);
        }
    }
}
7 голосов
/ 09 декабря 2010

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

Так что я бы сделал:

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

}
5 голосов
/ 09 декабря 2010

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

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

EDIT

На самом деле я использовал 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 - мое имя столбца

2 голосов
/ 03 сентября 2012

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

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

  2. Копирование файлов adb, aapt, AdbWinApi.dll и AdbWinUsbApi.dll из platform_tools в папку инструментов.

  3. Тогда Откройте командную строку и укажите путь к папке «Инструменты», в которой находятся настройки Android. Это выглядит как: - (Local Drive):\Android\android-sdk-windows\tools

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

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

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

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

sqlite> Select * from table name

Все данные в этой таблице будут отображаться.

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

2 голосов
/ 07 июля 2011

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

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

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

1 голос
/ 24 марта 2018

для программ Java это работало для меня:

    ResultSet rst = stm.executeQuery("SELECT * from Login");
           int i = 0;
           while(rst.next()){
               ++i;
               System.out.println(i);
           }
           System.out.println(i);
           if(i<1){
               //No data in the table
           }
           else{
               //data exists
           }
1 голос
/ 03 мая 2017

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

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

public boolean checkEmpty(SQLiteDatabase db, String table){
        return DatabaseUtils.queryNumEntries(db, table) == 0;
}
1 голос
/ 12 октября 2012

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

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

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

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

1 голос
/ 22 июня 2012

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

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

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

0 голосов
/ 28 ноября 2017
public boolean isEmpty(String TableName){

SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...