我怎样才能检查我的sqlite表中是否有数据?

时间:2010-12-09 11:36:49

标签: java sql android database 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 个答案:

答案 0 :(得分:31)

现有表上的查询SELECT COUNT(*) 永远不会返回null。如果表中没有行,则应返回包含值零的一行。

相反,具有非零值的行表示它为空。

在这两种情况下,都应返回一行,这意味着它将始终通过

//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]);
        }
    }
}

答案 1 :(得分:7)

rawQuery返回位于第一个条目之前的Cursor对象(查看更多信息hereSELECT COUNT(*)将始终返回结果(考虑到表存在)

所以我会这样做:

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

}

答案 2 :(得分:5)

正如paxdiablo所说,游标不会为空。你可以做的就像这样:

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是我的列名

答案 3 :(得分:2)

你的意思是说它有记录吗? 我试过这个,对我来说这是工作

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

它会显示表格的总和, 如果表没有记录,那么它将显示0。

答案 4 :(得分:2)

您可以手动检查:

  1. 在文件资源管理器中转到DDMS。 /data/data/(your application package)/databases 在这里,您将获得数据库文件。如果你想在表格中看到插入的值。

  2. 将platform_tools中的adbaaptAdbWinApi.dllAdbWinUsbApi.dll文件复制到工具文件夹。

  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键,您将获得该数据库中存在的所有表名。

  8. sqlite> Select * from table name
    

    该表中存在的所有数据都将显示。

    如有任何进一步的查询,请随时发表评论。

答案 5 :(得分:1)

我的检查方式是这样的:

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

我得到的_id条目在我的情况下是自动递增的。如果数据库为空,isAfterLast肯定会返回true。

答案 6 :(得分:1)

这个查询怎么样?

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

SELECT COUNT(*)略快一些。

P.S。检查了900万行的表格。

答案 7 :(得分:1)

已经提到的另一种选择是使用该功能  来自课程queryNumEntriesDatabaseUtils

一个例子可能如下:

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

答案 8 :(得分:1)

对于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
           }

答案 9 :(得分:0)

这就是我做的......

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 :(得分:0)

我的应用程序崩溃了尝试上面的代码,所以我这样做了,现在它完美运行了!

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 :(得分:0)

public boolean isEmpty(String TableName){

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