web-dev-qa-db-ja.com

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(*)決して nullを返す必要があります。テーブルに行がない場合は、値ゼロを含む1行を返す必要があります。

逆に、ゼロ以外の値を持つ行は、それがnot空であることを示します。

どちらの場合も、1つの行が返される必要があります。つまり、常に

_//do nothing everything's as it should be
_

セクション。

これを修正するには、クエリをそのままにしておきます(_select column_name_は不要で、おそらく少し非効率的であるという理由だけで実行したくありません)。 select count(*)のままにします。これは、常に1行を返し、次のコードを使用します(私の頭の中でのみテストされているので、注意してください)。

_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

Paxdiabloが言ったように、カーソルはnullにはなりません。あなたができることはこのように試すことです:

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. adbaapt、_AdbWinApi.dll_、および_AdbWinUsbApi.dll_ファイルをplatform_toolsからtoolsフォルダーにコピーします。

  3. 次に、コマンドプロンプトを開き、Androidセットアップが存在する "Tools"ディレクトリへのパスを設定します。次のようになります:-_(Local Drive):\Android\android-sdk-windows\tools_

  4. パスを設定した後、コマンド「adbShell」を引用符なしで記述します。 _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
The Holy Coder

あなたはそれが正しい記録を持っているかどうかを意味しますか?私はこれを試しました、そして私にとってそれは仕事です

    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私の場合は自動インクリメントのエントリ。 DBが空の場合、isAfterLastは確かにtrueを返します。

1
Jimmy

このクエリはどうですか?

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

SELECT COUNT(*)よりも少し高速です。

P.S. 900万行のテーブルをチェックしました。

1
bellum

すでに述べたものの別の代替手段は、関数 queryNumEntries from de class 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