9

現在sqliteデータベースにあるテーブルの数が必要です。検索を試みましたが、直接的な方法はありませんでした。

DbHelperでこのメソッドを試しました。

public int countTables() {
    int count = 0;
    String SQL_GET_ALL_TABLES = "SELECT * FROM sqlite_master WHERE type='table'";
    Cursor cursor = getReadableDatabase()
            .rawQuery(SQL_GET_ALL_TABLES, null);
    cursor.moveToFirst();
    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

        count++;
        getReadableDatabase().close();

    }
    cursor.close();
    return count;
}

しかし、この方法は私に間違ったカウントを与えます。DBにテーブルが3つしかないのですが、このメソッドはカウントを5として返します。このメソッドの何が問題になっている可能性があります。カウントを取得する直接的な方法はありますか?

4

3 に答える 3

23

あなたの方法は大丈夫です、あなたも使うことができますSELECT count(*) ...。ただし、自動的に作成される2つのテーブルがandroid_metadataありsqlite_sequence、単純にこれらを考慮に入れます。5-2=作成した3つのテーブル。

または、Squonkはsqlite_sequence、いつ作成され、いつ存在しないかについての優れたドキュメントを提供したので、次のクエリをお勧めします。

SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name != 'android_metadata' AND name != 'sqlite_sequence';

コードを短縮するためのいくつかのポインタ

このすべて:

cursor.moveToFirst();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

このように達成することができます:

while(cursor.moveToNext()) {

Cursor.moveToNext()は、次の行が存在する場合にtrueを返します。新しいカーソルが空でない場合、moveToNext()はtrueを返し、このインデックスを最初の位置に設定します。の場合cursor.isAfterLast() == true、moveToNext()はfalseを返します。

ただし、カーソル内の行数を単純にカウントしたい場合は、次のように使用します。

int count = cursor.getCount();

最後に、書き込み可能なデータベースを変数に格納します。

getReadableDatabase().close();

私はこれをテストしていませんが、getReadableDatabase()が毎回新しいSQLiteDatabaseオブジェクトを返す場合は、作成するとすぐにこの新しいデータベースを閉じるだけです...データベースを一度閉じてから閉じます取得したすべてのカーソルを閉じました。

SQLiteDatabase database = getReadableDatabase();
...

database.close();

多くのクエリを使用している場合は、onResume()でデータベースを開き、onPause()でデータベースを閉じることを検討してください。

于 2012-07-16T14:43:43.693 に答える
1

カウントとテーブル名を検索

カウントを見つける

ResultSet rs = st.executeQuery("select count(*) from sqlite_master as tables where type='table'");
System.out.println(rs.getInt(1));

テーブル名を取得する

ResultSet rs2 = st.executeQuery("select name from sqlite_master as tables where type='table'");
    while(rs2.next())
    {
          String tid = rs2.getString(1);
          System.out.println(tid);
    }
    rs.close();
于 2013-12-30T05:44:14.143 に答える
0

試す

              vvvvvv
SELECT * FROM YourDataBaseName.sqlite_master WHERE type='table';

図のようにDatabseNameを配置するだけです。

于 2012-07-16T14:45:06.037 に答える