3

1-SQLiteOpenHelperを何度も拡張するのは間違っており、機能しません。2-SQLiteOpenHelperを拡張して(CRUD)7つの異なるクラスを処理する大きなクラスがあるのは奇妙です。

これを行う例はありますか?巨大で依存するクラスなしで、多くのエンティティをデータベースにCRUDしますか?

Googleで2つまたは3つのテーブルよりも大きい例を見つけることができないようです。すべてのエンティティにsaveメソッドを備えた非常に大きなSQLiteOpenHelperがあるのは恐ろしいことです。このプロジェクトでもORMは許可されていません。

ヘルプ/指示はありますか?

4

2 に答える 2

2

すべてのエンティティに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();
      }
   }
}

注:これは最初の概念であり、特に更新が必要なため、更新が必要です。メソッドのパラメーター、トランザクションの使用方法、シングルトンとしてのデータソースを検討し、挿入、更新のパフォーマンステストを行います。すべてアプリケーションの特性に依存します。

于 2013-03-11T17:55:47.123 に答える
0

パラメータ化されたメソッドを使用することは、各テーブルの操作ごとに1つのメソッドを使用するよりも望ましい方法です。MBarni、これがあなたのニーズに対して十分に柔軟でない理由の例を提供できますか?

于 2013-03-12T00:53:41.473 に答える