Android:我可以使用一个SQLiteOpenHelper类来处理多个数据库文件吗?

我的应用使用两个数据库(单独的文件)。 为了处理这些数据库,我创build了两个扩展SQLiteOpenHelper的Helper类,每个数据库一个。

我现在要添加第三个数据库,并想知道是否需要创build另一个助手类(如果我使用第四和第五个数据库,我需要更多的助手类),或者我可以使用相同的助手类数据库?

我只想用一个Helper类看到的问题是我看不到如何将各个数据库文件的名称传递给Helper。 目前,数据库的名称被硬编码为每个Helper类的Static字段,但是如果我只有一个Helper类,则需要在创build单独的Helper时将不同的名称传递给构造函数对象; 问题是SQLiteOpenHelper构造函数似乎被Android调用只有一个参数:上下文。

Solutions Collecting From Web of "Android:我可以使用一个SQLiteOpenHelper类来处理多个数据库文件吗?"

当然可以。 这只是你的助手类devise的问题。 您可以将数据库的名称传递给Helper类构造函数(以及必需的Context实例),而不是进行硬编码:

 public class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String dbName, int dbVersion) { super(context, dbName, null, dbVersion); } ... } 

您需要一个实现此处所述升级过程的抽象类。 然后你为每个表扩展这个抽象类。 在你的抽象类中,你必须以某种方式(列表,硬编码)存储你的表,所以当onUpgrade激发你遍历表项和每个表项时,执行上述步骤。 他们将自我升级,保留所有现有的细节。 请注意,onUpgrade事件每个数据库只触发一次,这就是为什么你需要迭代所有的表来升级所有的表。 您只在所有数据库上保留1个版本号。

  • 的BeginTransaction
  • 运行一个表创build, if not exists (我们正在升级,所以表可能不存在,它会失败改变和下降)
  • 在列表中放入现有的列List<String> columns = DBUtils.GetColumns(db, TableName);
  • 备份表( ALTER table " + TableName + " RENAME TO 'temp_" + TableName
  • 创build新表(最新的表创build模式)
  • 获取与新列的交集,这次从升级后的表中取出columns.retainAll(DBUtils.GetColumns(db, TableName));
  • 恢复数据( String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName));
  • 删除备份表( DROP table 'temp_" + TableName
  • setTransactionSuccessful

(这不处理表降级,如果您重命名列,您没有得到传输的现有数据列名不匹配)。

 public static List<String> GetColumns(SQLiteDatabase db, String tableName) { List<String> ar = null; Cursor c = null; try { c = db.rawQuery("select * from " + tableName + " limit 1", null); if (c != null) { ar = new ArrayList<String>(Arrays.asList(c.getColumnNames())); } } catch (Exception e) { Log.v(tableName, e.getMessage(), e); e.printStackTrace(); } finally { if (c != null) c.close(); } return ar; } public static String join(List<String> list, String delim) { StringBuilder buf = new StringBuilder(); int num = list.size(); for (int i = 0; i < num; i++) { if (i != 0) buf.append(delim); buf.append((String) list.get(i)); } return buf.toString(); }