it-swarm.com.ru

Как я могу проверить, есть ли в моей таблице 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'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());}
    }

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

12
Holly

Запрос 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]);
        }
    }
}
31
paxdiablo

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

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

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

}
7
ccheneson

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

if (cur != null && cur.getCount() > 0){
     // do nothing, everything's 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 - мое имя столбца.

5
Varun

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

  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
Android Expert

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

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

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

2
flowoverstack

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

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

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

1
Jimmy

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

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

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

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

1
bellum

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

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

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

для программ 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
Mohd Zaid
public boolean isEmpty(String TableName){

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

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

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");
}
0
MCR

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

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;
}
0
PossessWithin

Использовать этот:

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+"';";
0
DeathRs