目前正在构建一个应用程序,它将拥有一个包含许多表的大型复杂数据库。该数据库的结构可能在未来阶段发生变化。而不是对结构进行硬编码(从而使得以后回来并改变它很烦人) - 是否有更有效的方法在android中记录数据库结构?理想情况下,我希望能够将结构存储在XML文件或其他内容中,然后创建一个读取XML并相应地调整数据库的函数。这是一个常见的要求吗?如果是这样,标准方法是什么?
答案 0 :(得分:0)
http://simple.sourceforge.net/
您可以使用Simple XML将对象序列化/反序列化为XML。它将妥善处理您的DTO的架构更改。然后你的序列化xml字符串可以存储为文件或作为更简单的数据库结构的一部分,这是我通常做的。通过这种方式,结构的复杂和变化部分可以在xml-mapped-to-dto中,它们将驻留在您通常在数据库记录中使用的逻辑位置。
对于数据库,您可以使用http://h2database.com/
答案 1 :(得分:0)
我使用greenDAO非常容易使用。
即使它不是XML文件,您也应该尝试。
首先使用简单的类创建新的Java Project(例如eclipse):
public static void main(String[] args) throws Exception {
Schema schema = new Schema(1, "com.example.yourpackage");
addEverything(schema);
new DaoGenerator().generateAll(schema, "../your_android_project_directory/src-gen-dao");
}
private static void addEverything(Schema schema) {
Entity product = ProductDescriptor.describe(schema);
Entity module = ModuleDescriptor.describe(schema);
Entity lienModuleProduit = LinkModuleProductDescriptor.describe(schema, product, module);
}
public class ProductDescriptor {
public static Entity describe(Schema schema) {
Entity product = schema.addEntity("Product");
produit.setTableName("product_prd");
produit.addLongProperty("productId").columnName("PRD_ID").primaryKey().autoincrement();
produit.addStringProperty("label").columnName("PRD_LBL");
produit.addFloatProperty("price").columnName("prd_price");
return product;
}
}
public class LinkModuleProductDescriptor {
public static Entity describe(Schema schema, Entity product, Entity module) {
Entity linkModuleProduct = schema.addEntity("LinkModuleProduct");
linkModuleProduct.setTableName("lnk_mod_prd");
linkModuleProduct.addLongProperty("idLinkModPrd").columnName("LNK_ID").primaryKey().autoincrement();
Property productId = linkModuleProduct.addLongProperty("productId").notNull().columnName("PRD_ID")
.getProperty();
lienModuleProduct.addToOne(product, productId);
Property moduleId = linkModuleProduct.addLongProperty("moduleId").notNull().columnName("MOD_ID")
.getProperty();
linkModuleProduct.addToOne(module, moduleId);
linkModuleProduct.addIntProperty("moduleVoieNum").columnName("MODULE_VOIE_NUM");
return linkModuleProduct;
}
}
select data_type from (
SELECT CASE WHEN DATA_TYPE IN ('int') THEN 'addIntProperty '
WHEN DATA_TYPE IN ('smallint') THEN 'addShortProperty '
WHEN DATA_TYPE IN ('bigint') THEN 'addLongProperty '
WHEN DATA_TYPE IN ('tinyint') THEN 'addBooleanProperty'
WHEN DATA_TYPE IN ('varchar', 'char', 'text', 'longtext') THEN 'addStringProperty '
WHEN DATA_TYPE IN ('date', 'time', 'datetime', 'timestamp') THEN 'addDateProperty '
WHEN DATA_TYPE IN ('decimal') THEN 'addFloatProperty '
WHEN DATA_TYPE IN ('blob', 'longblob', 'smallblob') THEN 'addByteProperty '
ELSE 'probleme' END AS data_type
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE_NAME'
) table_temp;
您在Android项目中添加 src-gen-dao 作为源文件夹。
然后你使用greendao。一个非常好的图书馆。
private static void truncateAllTable(final Context context) {
DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DatabaseConstants.DATABASE_NAME, null);
DaoMaster.dropAllTables(helper.getWritableDatabase(), true);
DaoMaster.createAllTables(helper.getWritableDatabase(), true);
helper.close();
}
我让你了解如何write queries。