編集、以下の回答に基づいてコードを少し変更しましたが、まだ機能していません。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を返す必要があります。テーブルに行がない場合は、値ゼロを含む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]);
}
}
}
_
rawQuery
は最初のエントリの前に配置されたCursor
オブジェクトを返します(詳細を参照 ここ )SELECT COUNT(*)
は常に結果を返します(考慮してテーブルが存在します)
だから私はします:
if (cur != null){
cur.moveToFirst();
if (cur.getInt(0) == 0) {
// Empty
}
}
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は私の列名でした
あなたはそれを手動でチェックすることができます:
エクスプローラーでDDMSに移動します。 /data/data/(your application package)/databases
ここでデータベースファイルを取得します。また、テーブルに挿入された値を確認したい場合。
adb
、aapt
、_AdbWinApi.dll
_、および_AdbWinUsbApi.dll
_ファイルをplatform_toolsからtoolsフォルダーにコピーします。
次に、コマンドプロンプトを開き、Androidセットアップが存在する "Tools"ディレクトリへのパスを設定します。次のようになります:-_(Local Drive):\Android\android-sdk-windows\tools
_
パスを設定した後、コマンド「adbShell」を引用符なしで記述します。 _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
_
そのテーブルに存在するすべてのデータが表示されます。
それ以上の質問については、コメントしてください。
あなたはそれが正しい記録を持っているかどうかを意味しますか?私はこれを試しました、そして私にとってそれは仕事です
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(*)
よりも少し高速です。
P.S. 900万行のテーブルをチェックしました。
すでに述べたものの別の代替手段は、関数 queryNumEntries from de class DatabaseUtils を使用することです。
例は次のとおりです。
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
}
public boolean isEmpty(String TableName){
SQLiteDatabase database = this.getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(database,TableName) == 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");
}
上記のコードを試してアプリがクラッシュしていたので、これを実行したところ、完全に機能しています。
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;
}