繁体   English   中英

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

[英]How can i check to see if my sqlite table has data in it?

编辑,根据下面的答案稍微改变了代码,但仍然没有工作。 我还添加了一条日志消息,告诉我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());}
    }

对不起,如果这是一个非常愚蠢的问题或方法,我对这一切都是新手。 任何答案非常感谢!

现有表上的查询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]);
        }
    }
}

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

所以我会这样做:

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

}

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

您可以手动检查:

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

  2. adbaaptAdbWinApi.dllAdbWinUsbApi.dll文件从platform_tools复制到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

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

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

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

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

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

我的检查方式是这样的:

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

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

这个查询怎么样?

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

它比SELECT COUNT(*)略快一些。

PS检查了900万行的表格。

已经提到的另一种替代方法是使用de class DatabaseUtils中的函数queryNumEntries

一个例子如下:

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

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

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

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

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

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

用这个:

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+"';"; 
public boolean isEmpty(String TableName){

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM