0

Activity を拡張するメイン クラスとは別のクラスにある SQLite データベースがあります。

データベースのセットアップには 2 つの方法があることに気付きました。1 つの方法は、クラス内またはネストされたサブクラスとして、メインの Activity クラス内に配置することです。2 番目の方法は、別のクラスに配置することです。

別のクラスの方が見栄えは良いですが、欠点が 1 つあります。何かをするたびに、メイン アクティビティ クラスでそのインスタンスを作成する必要があります。Android でのオブジェクトのインスタンス化はコストがかかるため、避けるべきであると読みました。

それにもかかわらず、データベースを別のクラスとして作成したいと思います。オブジェクトをインスタンス化するコストは、データベースを同じクラスに配置するのに十分なコストですか?

SQLite データベースの別のクラスの例: 不完全な疑似コード

public class SQLiteDB {
   private static class DbHelper extends SQLiteOpenHelper{
      // db helper methods
   }

// methods for DB, like get, set, and others
public void openDatabase(){  }
public void closeDatabse(){  }
public void insertRecord(String record){  }
}

メイン アクティビティでの使用例: incompete psudo-code

public class Main extends Activity{

// every time I want to use it I must instantiate an object for the database class

// many instances of SQLiteDB object created, garbage collector works hard

SQLiteDB mDatabase = new SQLiteDB();

openDatabase();

insertRecord("insert this");

closeDatabase();

}
4

3 に答える 3

2

別のクラスと同じクラスの SQLite データベース、どちらが優れていますか?

これは非常に包括的な質問であり、より多くの要因 (アプリケーションの種類、個人的な要件、データベースの扱い方など) によって異なります。誰かがデータベースを内部クラスとして配置し、誰かを分離クラスとして配置することを好む場合があります。問題は、多くの開発者ができるだけ多くのコードを 1 つのクラスに「固執」しようとしており、おそらくもう少し多くのクラスを作成することを「恐れている」ことです。正確にはわかりません。私はそれを私の個人的なメモとしてのみ言及しました。

しかし、あなたの質問に戻りましょう。何が良いですか?

クラス分けでのアプローチだと思います。>UI を作成して処理するためだけに、Activity クラスを「Activity クラス」のみにする必要があります。アプリケーションの外観は、アプリケーション ロジックから分離する必要があります。この「ルール」に従えば、コードはよりきれいになり、人間が読めるようになります (他の誰かがあなたのコードを見たとしても、彼は完全に失われるべきではありません)。純粋に書かれたクラスが 20 個あるのは、すべてのものを 1 つのクラス (豚のように) にまとめておくのと同じように恥ずべきことではありません。

ただし、欠点が 1 つあります。何かをするたびに、メイン アクティビティ クラスでそのインスタンスを作成する必要があります。Android でのオブジェクトのインスタンス化はコストがかかるため、避けるべきであると読みました。

の使用法について考えましたSingletonか? このデザインパターンは考える価値があります。メモリの無駄がなく、多くの利点を持つインスタンスは常に 1 つだけです。私はシングルトンで良い経験しかありません。したがって、試して使用することをお勧めします。

例:

private static SQLiteOpenHelper instance;

public static SQLiteOpenHelper getInstance(Context mContext) {
   if (instance == null) {
      instance = new SQLiteOpenHelperImplementation(mContext);
   }
   return instance;
}

最後に、いくつかの提案をします。

  • カーソル、データベースなどを操作するたびに、作業が完了したらすぐに解放/閉じます。SQLiteDatabaseこれにより、およびに関連する多くの例外を解決できます。Cursor

  • 同期されたブロックとメソッドの使用は、並行プログラミングの場合、多くの問題を回避するための非常に良い方法です

  • データベースに複数のテーブルがある場合は、テーブルごとにCRUD操作とテーブルの特定のメソッドをラップする「サービス」クラスを作成することをお勧めします

  • Activity が破棄される前に、まだリリースされていないすべてのソースを確認してリリースします。

于 2013-03-31T23:03:33.927 に答える
0

私はあなたがここで与えた解決策を好みます。主な利点は、アプリ内の任意のアクティビティ(または他のクラス)からデータベースに簡単にアクセスできることです。データベースを使用するたびに新しいインスタンスを作成する問題を解決するには、代わりにで単一のインスタンスを作成しonCreate()、アクティビティがアクティブなときに必要なすべてのデータベースを使用して、最後にでデータベースを閉じますonDestroy()

于 2013-01-31T00:42:49.360 に答える
0

これは個人の好みの問題でしょう。

しかし、私が効率的でクリーンであるとわかったのは、SQLiteOpenHelper を拡張するクラスを作成することです。このクラスでは、SQL コードを記述してテーブルを作成し、ストアド プロシージャとしてメソッドを記述します。

クラスは次のようになります。

public class DatabaseInterface extends SQLiteOpenHelper {

// Database version
private static final int DATABASE_VERSION = 1;
public DatabaseInterface(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}
//in your oncreate you will write the queries to create your tables
@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_NEWS = "CREATE TABLE News(id INTEGER)";

    db.execSQL(CREATE_NEWS);
}

// upgrading tables
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // drop tables if exist
    db.execSQL("DROP TABLE IF EXSIST " + NEWS);
    // recreate tables
    onCreate(db);

}

コンストラクターとして 1 つのパラメーターを取る News obj があるとします。ストアド プロシージャは次のようになります。

public ArrayList<News> getNews() {
    ArrayList<News> mNewes = new ArrayList<News>();
    SQLiteDatabase db = null;
    Cursor cursor = null;

    try {
        String sQry = "SELECT * FROM " + NEWS;
        db = this.getWritableDatabase();
        cursor = db.rawQuery(sQry, null);

        if (cursor.moveToFirst()) {
            do {
                mNewes.add(new News(cursor.getInt(0)));

            } while (cursor.moveToNext());
        }
    } catch (SQLiteException e) {
        Log.e("SQLite - getNewes", e.getMessage());
        return null;
    } finally {
        cursor.close();
        db.close();
    }

    return mNewes;
}

上記の方法では、アプリケーション データベースを取得して開き、SQL エラーを予期してクエリを実行し、データベースを閉じます。このようにすることで、必要のない/使用していないリソースが開かれることがなくなります。

現在市場に出回っている 2 つのアプリでこのメソッドを使用しましたが、ストアド プロシージャ用に作成したメソッドを数百回呼び出すと、かなり高速に実行されます。

于 2013-01-31T00:44:56.053 に答える