すべてのエンティティにsaveメソッドを備えた非常に大きなSQLiteOpenHelperがあるのは恐ろしいことです。
優れた指定アプリケーションには数行のコード行しかないと思いますか?
AndroidではSQLiteOpenHelper
、から拡張することが可能な限り最良の選択です。必要なすべてのロジックをラップし、それを使用して作業するのは非常に快適だと思います。しかし、すべてが正しい実装を必要とします。
SQLiteOpenHelperを何度も拡張するのは間違っており、機能しません
ほとんどの場合、問題はありませんが、SQLiteOpenHleper
実装と使用法が間違っていると思います。
つまり、たとえばORMフレームワークORMLite
は許可されていないので、SQLiteOpenHelper
正しくクリーンな実装を使用して作成することをお勧めします。
アップデート:
7つの保存方法。7つの更新方法。7mehotdsを削除します。7メソッドを選択します。データベースから他のデータを取得するための他の多くの方法。それは最良の選択ですか?
コメントで私がどういう意味だったか、これは実装の問題です。7つのテーブルの上に7つのsaveメソッドは本当に必要ありません。これが私の最初のアイデアです。1つのユニバーサルメソッドを作成するのはどうですか?
public class DataSourceTools {
private SQLiteOpenHelper handler;
private SQLiteDatabase db;
public DataSourceTools(SQLiteOpenHelper handler) {
this.handler = handler;
}
public void saveObject(String table, ContentValues data) {
try {
db = openWrite(this.handler);
if (db != null) {
db.insert(table, nullColumnHackName, data);
}
}
finally {
close(db);
}
}
public void updateObject(String table, ContentValues dataToUpdate) {
try {
db = openWrite(this.handler);
if (db != null) {
String whereClause = "...";
String[] whereArgs = {...};
db.update(table, dataToUpdate, whereClause, whereArgs);
}
}
finally {
close(db);
}
}
public void deleteObject(String table, ContentValues data) {
try {
db = openWrite(this.handler);
if (db != null) {
String whereClause = "...";
String[] whereArgs = {...};
db.delete(table, whereClause, whereArgs);
}
}
finally {
close(db);
}
}
public Object findObject(String table, ContentValues data) {
Object myObject = null;
Cursor c = null;
try {
String[] columns = {"id", "name", "lastname", ...};
String selection = "id = ?";
String[] selectionArgs = {data.getAsString("key_id")};
c = db.query(table, columns, selection, selectionArgs, null, null, null);
if (c.moveToFirst()) {
myObject = new Object();
myObject.setId(c.getInt(c.getColumnIndex("id")));
myObject.setName(c.getString(c.getColumnIndex("name")));
myObject.setLastName(c.getString(c.getColumnIndex("lastname")));
}
return myObject;
}
finally {
if (c != null) {
c.close()
}
close(db);
}
}
public List<Object> findAll(String table) {
List<Object> objects = new ArrayList<Object>();
Object myObject = null;
Cursor c = null;
try {
String[] columns = {"id", "name", "lastname", ...};
c = db.query(table, columns, null, null, null, null, null);
if (c.moveToFirst()) {
myObject = new Object();
myObject.setId(c.getInt(c.getColumnIndex("id")));
myObject.setName(c.getString(c.getColumnIndex("name")));
myObject.setLastName(c.getString(c.getColumnIndex("lastname")));
objects.add(myObject);
}
return objects;
}
finally {
if (c != null) {
c.close()
}
close(db);
}
}
private final synchronized SQLiteDatabase openWrite(SQLiteOpenHelper handler) {
if (handler != null) {
return handler.getWritableDatabase();
}
return null;
}
private final synchronized SQLiteDatabase openRead(SQLiteOpenHelper handler) {
if (handler != null) {
return handler.getReadableDatabase();
}
return null;
}
private final synchronized void close(SQLiteDatabase db) {
if (db != null && db.isOpen()) {
db.close();
}
}
}
注:これは最初の概念であり、特に更新が必要なため、更新が必要です。メソッドのパラメーター、トランザクションの使用方法、シングルトンとしてのデータソースを検討し、挿入、更新のパフォーマンステストを行います。すべてアプリケーションの特性に依存します。