最有效的存储数据库结构的方法

时间:2013-07-22 15:35:11

标签: android

目前正在构建一个应用程序,它将拥有一个包含许多表的大型复杂数据库。该数据库的结构可能在未来阶段发生变化。而不是对结构进行硬编码(从而使得以后回来并改变它很烦人) - 是否有更有效的方法在android中记录数据库结构?理想情况下,我希望能够将结构存储在XML文件或其他内容中,然后创建一个读取XML并相应地调整数据库的函数。这是一个常见的要求吗?如果是这样,标准方法是什么?

2 个答案:

答案 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):


MAIN CLASS


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

TABLE CLASS


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

}


SQL QUERY,以简化“表类”的编写


 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。一个非常好的图书馆。


在您的Android项目中


    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