簡體   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