Как я могу проверить, есть ли в моей таблице 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());}
}
Извините, если это довольно глупый вопрос или подход, я новичок во всем этом. Любые ответы очень ценятся!
Ответы
Ответ 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;
}