2011-08-03 5 views
7

アプリケーションが非常に複雑で多くのデータベース操作が必要なため、MVCパターンを実装する必要があることがわかったとき、データベースアプリケーションで作業を始めました。
これに関して、私はデータベース操作を扱うために別のmodel classを作成することに決めました。このクラスは、Sqliteコマンド(例えば、Select)またはを実行した後に私にデータを返すすべてのメソッドを持ち、単にSQLiteコマンドを実行します(例えばDelete)。しかし、私が望むのは、このクラスをDatabase Adapterクラスから分離することです。そこでは、データベースを開いて作成して閉じます。
私はコードの中に私の概念を入れてみましょう:データベース処理のためのデータモデルクラスの作成

public class DataModel 
{ 
/* 

Private members 

*/ 

// Method to Select data from Student table 
public ArrayList<String> FetchStudents (parameter 1) 
{ 
private ArrayList<String> arrStudent; 


DatabaseAdapter objDB= new DatabaseAdapter(); 
objDB.open(); 
/* 
Some code 
*/ 
objDB.close(); 


return arrStudent 
} 

//Method to delete record from Student table 
public DeleteStudent(parameter 1) 
{ 
DatabaseAdapter objDB= new DatabaseAdapter(); 
objDB.open(); 
//Some code 
objDB.close(); 
} 

/* 

Rest of methods 

*/ 
} 

// DatabaseAdapterClass

private static class DatabaseHelper extends SQLiteOpenHelper { 
DatabaseHelper(Context context) { 
super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
/** 
* onCreate method is called for the 1st time when database doesn't exists. 
*/ 
@Override 
public void onCreate(SQLiteDatabase db) { 
Log.i(TAG, "Creating DataBase: " + CREATE_STUDENT_TABLE); 
db.execSQL(CREATE_STUDENT_TABLE); 
} 
/** 
* onUpgrade method is called when database version changes. 
*/ 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
         + newVersion); 
} 
} 

質問
私は何を聞いてみたいことは、これは実装の正しいアプローチですか? データベースメソッドの個別のクラスを作成すると問題ありませんか?後で私が困っていると思われる制限や問題は何ですか?また、上記のコンセプトを実装するより良い方法はありますか?

おかげ
ストーン

答えて

11

「モデルクラス」と呼ばれるものは、データアクセスオブジェクト(DAO)としてよく知られています。モデルは通常、データとビジネスロジックを保持するクラスのセットです。おそらくStudentクラスにID、名前、GPAなどのプロパティを持つクラスがあります。モデルからデータアクセスを分離する場合は、データアクセスクラス(DatabaseHelper)でデータベースにクエリを行い、取得したデータを使用してStudentオブジェクトまたはList<Student>を返します。データアクセスクラスをデータベースヘルパーから分離することはあまり意味がありません。データベース関連のコードをすべて1か所にまとめる方がよいでしょう。

しかし、モデルクラス(唯一)を使用することは、Android(カーソル)からのデータの取得と表示をネイティブにサポートしているため、必ずしも現実的ではない場合があります(CursorAdapterなど)。それらのいずれかを使用したい場合は、モデルオブジェクトではなくCursorのデータを公開する必要があります。コンテンツプロバイダに関しては、それらも見てみましょう。しかし、他のアプリケーションにデータを公開する必要がない場合は、ContentProviderを書くことは過度の可能性があります。

また、各クエリでデータベースを開いたり閉じたりしたくないということもあります。実際に開いておくと安全です。アプリのプロセスが終了すると自動的に閉じられます。

0

Androidのネイティブアプローチデータモデリングはcontentprovidersです。 Link

データソースの種類も同様に抽象化されます。

私はそれを同じようなやり方でやっていました。しかし、再びその主観的です。

1

私のアプリケーションでこれを行います。すばらしいことに、コードはきれいで、性能にはまったく影響がありません。私は他のアプローチのすべてを試してみましたし、コンテンツプロバイダーも使用しましたが、私の意見では複雑なものを超えました。

関連する問題