在 Android SQLite 中处理"complex"数据库



1 -扩展多次SQLiteOpenHelper是错误的,不会工作。有一个大的类扩展SQLiteOpenHelper来处理(CRUD) 7个不同的类是奇怪的。

有这样做的例子吗?在没有庞大的依赖类的情况下将许多实体添加到数据库中?

我在Google上似乎找不到大于2或3个表格的例子。有一个非常大的SQLiteOpenHelper与保存方法为我所有的实体是可怕的。此项目也不允许使用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();
      }
   }
}

注意:这是第一个概念,刚刚专门为你写的,所以它需要更新:考虑方法的参数->如何做出更好的选择,事务的使用,数据源作为单例,做一些性能测试插入,更新。

使用参数化方法比为每个表上的每个操作使用一个方法更可取。barni,你能举个例子说明为什么这不够灵活,不能满足你的需求吗?

最新更新