0

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

4

2 回答 2

0

http://simple.sourceforge.net/

您可以使用简单 XML 将对象序列化/反序列化到 XML 和从 XML 中提取。它将很好地处理您的 DTO 的架构更改。然后您的序列化 xml 字符串可以存储为文件或作为我通常做的更简单的数据库结构的一部分。这样,您的结构中复杂且不断变化的部分可以位于 xml-mapped-to-dto 中,并且它们将驻留在您通常在数据库记录中使用的相同逻辑位置。

对于数据库,您可以使用http://h2database.com/

于 2013-07-22T15:41:41.900 回答
0

我使用非常容易使用的greenDAO 。

即使它不是 XML 文件,您也应该尝试。

首先,您使用一个简单的类创建新的 Java 项目(例如 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;
}

}


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;                                                                                                                              

您将src-gen-dao添加为 Android 项目中的源文件夹。

然后你使用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();
}

我让你看看如何编写查询

于 2013-07-22T15:51:26.917 回答