1-多次扩展SQLiteOpenHelper是错误的,无法正常工作。
2-具有扩展SQLiteOpenHelper来处理(CRUD)7个不同类的大类很奇怪。

有没有这样做的例子?在没有庞大而又依赖的类的情况下,将许多实体CRUD到我的数据库中?

我似乎在Google上找不到大于2或3个表的示例。
拥有一个非常大型的SQLiteOpenHelper并带有我所有实体的save方法是可怕的。
这个项目也不允许使用ORM。

有帮助/指示吗?

最佳答案

有一个非常大的SQLiteOpenHelper,其中包含我所有的保存方法
实体是可怕的。

您是否认为一个好的指定应用程序将只有几行代码?

在Android中,从SQLiteOpenHelper扩展是最好的选择。我认为它包装了所有必需的逻辑,并且使用它非常舒适。但是,所有这些都需要正确的实现。

多次扩展SQLiteOpenHelper是错误的,无法正常工作

很有可能SQLiteOpenHleper没有问题,但是我认为错误的实现和用法。

怎么说,ORM框架(例如ORMLite)是不允许的,所以我的建议是使用SQLiteOpenHelper并进行正确而干净的实现。

更新:

7种保存方法。 7种更新方法。 7删除方法。 7种选择方法。
许多其他方法可从数据库中获取其他数据。最好吗
选择?

我在评论中的意思是实施的问题。您确实不需要7个表上方的7个保存方法。这是我的第一个主意。如何创建一种通用方法?

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();
      }
   }
}

注意:这是第一个概念,刚刚为您专门编写,因此需要更新:考虑方法的参数->如何做出更好的选择,使用事务,将数据源作为单例,并对插入,更新进行一些性能测试。一切都取决于应用程序的特性。

10-08 06:37