{"id":137,"date":"2017-03-22T23:50:07","date_gmt":"2017-03-22T22:50:07","guid":{"rendered":"http:\/\/uc-mobileapps.com\/de\/?page_id=137"},"modified":"2021-01-30T14:10:09","modified_gmt":"2021-01-30T13:10:09","slug":"sqlite-versionierung-von-tabellen-tabellenspalten","status":"publish","type":"page","link":"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/","title":{"rendered":"Versionierung von Tabellen und Spalten"},"content":{"rendered":"<p>Beide Annotationen&nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeClass<\/code>&nbsp;und <code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeField<\/code>&nbsp;haben ein Versionsattribut. Es definiert ab welcher Modellversion das BO oder Datenfeld erstmals verf\u00fcgbar war.<br \/>\nWann immer die App von einer vorherigen Datenbankversion aktualisiert wird, werden die n\u00f6tigen Tabellenskripte ausgef\u00fchrt um auf das neueste Modell zu migrieren. Dies geschieht mit dem von Android empfohlenen Standard mechanismus SQLOpenHelper. Das Gleiche funktioniert f\u00fcr mit &nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeField<\/code>&nbsp;annotierte Attribute. Wenn eine Menge Felder dem Datenmodell hinzugef\u00fcgt werden sollen, f\u00fcgt man sie mit der gleichen neuen Versionsnummer hinzu. Diese muss nat\u00fcrlich gr\u00f6\u00dfer sein als die bisherig&nbsp;vergebenen, auch sollte sie nicht mehr ge\u00e4ndert werden um die Kompatibilit\u00e4t zwischen verschiedenen Versionen beizubehalten.<\/p>\n<p>Wenn eine Klasse eine Version in der&nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeClass<\/code>&nbsp;Annotation hat, m\u00fcssen die Versionen sp\u00e4ter hinzugef\u00fcgter Attribute gr\u00f6\u00dfer als diese sein.<\/p>\n<p>Der erzeugte DBOpenHelper wird die &nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">create()<\/code>&nbsp;Methode erstellen, die das aktuelle Datenmodell erzeugt. Ferner stellt es die&nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">update()<\/code>&nbsp;Methode bereit, die die ben\u00f6tigte Logik enth\u00e4lt um die verschiedenen Versionen &nbsp;zu aktualisieren. Datenbank-Indezes und -Constraints von neuen Klassenattributen&nbsp;k\u00f6nnen f\u00fcr f\u00fcr die Spaltenupdates nicht generiert werden und m\u00fcssen manuell erzeugt werden.<br \/>\nWenn allerdings in einer neuen Version eine komplette Klasse hinzugef\u00fcgt wird, so wird das passende <code class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">create table ..<\/code>&nbsp;Skript aufgerufen und die Tabellen mit Constraints und Index erstellt.<\/p>\n<p>Beispiel<br \/>\nDie Klasse Language ist in Version 2 hinzugekommen. In Version 3 wurde eine neue Eigenschaft &#8220;description&#8221; hinzugef\u00fcgt.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeClass(sqlTablename=\"locale\", version=2, generatorOptions={GeneratorOption.BOCLASS, GeneratorOption.SCHEMA_PEER, GeneratorOption.DB_HELPER+\"=DBHelper\"})\npublic class Language {\n\n  @SeifeField(isPrimaryKey=true, sqlOptions=@SqlFieldOptions(sqlAutoIncrement=false, sqlColumn=\"_country\"))\n  private String countryId;\n  @SeifeField(isPrimaryKey=true, sqlOptions=@SqlFieldOptions(sqlAutoIncrement=false, sqlColumn=\"_language\"))\n  private String languageId;\n\n  @SeifeField(version=2)\n  private String name;\n\n  @SeifeField(version=3)\n  private String description;\n\n  @SeifeField(mandatory = true,version=2)\n  private String flag;\n}<\/pre>\n<p>Der f\u00fcr den SQLiteOpenHelper erzeugte zugeh\u00f6rige Code und die passende&nbsp;Klasse mit den SQL-Schema Definitionen<\/p>\n<div class=\"osc-res-tab tabbable   osc-tabs-left\"><div style=\"clear:both;width: 100%;\"><ul class=\"nav osc-res-nav nav-tabs osc-tabs-left-ul\" id=\"oscitas-restabs-1-sqlite-versionierung-von-tabellen-tabellenspalten-80038\"><li class=\"active\"><a href=\"#ert_pane1-0\" data-toggle=\"tab\">SQLiteOpenHelper<\/a><\/li><li class=\"\"><a href=\"#ert_pane1-1\" data-toggle=\"tab\">Schema Peer<\/a><\/li><\/ul><\/div><div style=\"clear:both;width: 100%;\"><ul class=\"tab-content\" id=\"oscitas-restabcontent-1-sqlite-versionierung-von-tabellen-tabellenspalten-80038\"><li class=\"tab-pane active\" id=\"ert_pane1-0\"><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/**\n * Database helper that creates and\/or upgrades the schema\n *\/\npublic class DBHelper extends SQLiteOpenHelper\n{\n  \/**\n   * Name of the database\n   *\/\n  private static final String DB_NAME = \"DBHelper.db\";\n\n  \/**\n   * The version of this database for the current release\n   *\/\n  private static final int DB_VERSION = 3;\n\n  \/**\n   * Default constructor for the helper\n   *\/\n  public DBHelper(Context paramContext) {\n    this(paramContext, DB_NAME, null, DB_VERSION);\n  }\n\n  protected DBHelper(Context paramContext, String paramString, SQLiteDatabase.CursorFactory paramCursorFactory, int paramInt) {\n    super(paramContext, paramString, paramCursorFactory, paramInt);\n  }\n\n  @Override\n  public void onCreate(SQLiteDatabase db) {\n    seifeCreate(db);\n  }\n\n  @Override\n  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n    seifeUpgrade(db, oldVersion, newVersion);\n  }\n\n  \/\/[begin seife autogenerated@\n\n  \/**\n   * Outsourced data creation logic of automatically created tables, see {@see #onCreate(SQLiteDatabase)}\n   *\/\n  public void seifeCreate(SQLiteDatabase db) { \n    for (String ddl : LanguageSchema.instance().getTableScripts()) {\n      db.execSQL(ddl);\n    }\n  }\n  \n  \/**\n   * Outsourced data update logic of automatically created tables, see {@see #onUpgrade(SQLiteDatabase,int,int)}\n   *\/\n  public void seifeUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n    if (oldVersion &lt; 2 &amp;&amp; newVersion &gt;= 2) { \n      for (String ddl : LanguageSchema.instance().getTableScripts()) {\n        db.execSQL(ddl);\n      }\n    }\n    if (oldVersion &lt; 3 &amp;&amp; newVersion &gt;= 3) { \n      db.execSQL(\"ALTER TABLE \" + LanguageSchema.TBL_LANGUAGE + \" ADD COLUMN \" + LanguageSchema.COL_DESCRIPTION + \" text\");\n    }\n  }\n\n  \/\/@end seife autogenerated]\n\n}\n<\/pre>\n<p><\/li><li class=\"tab-pane \" id=\"ert_pane1-1\"><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">public class LanguageSchema { \n  \/\/[begin seife autogenerated@\n\n  \/**\n   * Table name of the Language table\n   *\/\n  public static String TBL_LANGUAGE = \"locale\";\n  \n\n  public static String COL_COUNTRY_ID = \"_country\";\n\n  public static String COL_LANGUAGE_ID = \"_language\";\n\n  public static String COL_DESCRIPTION = \"description\";\n\n  public static String COL_FLAG = \"flag\";\n\n  public static String COL_NAME = \"name\";\n  \n  \/**\n   * All columns\n   *\/\n  public static String[] COLUMNS = new String[] { COL_COUNTRY_ID, COL_LANGUAGE_ID, COL_DESCRIPTION, COL_FLAG, COL_NAME\t};\n\n  \/**\n   * Table creation script\n   *\/\n  private static final String SQL_CREATE_TABLE_LANGUAGE =\n      \"create table \" + TBL_LANGUAGE + \" (\" + \n\n          COL_COUNTRY_ID + \" text primary key,\" +\n          COL_LANGUAGE_ID + \" text primary key,\" +\n          COL_DESCRIPTION + \" text,\" +\n          COL_FLAG + \" text not null,\" +\n          COL_NAME + \" text\" +\n          \")\";\n\n  private static LanguageSchema schema = new LanguageSchema();\n  public static LanguageSchema instance() {\n    return schema;\n  }\n\n  \/**\n   * Checks for mandatory constraints defined on fields\n   *\/\n  public boolean checkConstraints(ContentValues contentValues) {\n    return true;\n  }\n  \n  \/**\n   * Gets all attribute values of the bo as key value pairs\n   * @param bo may not be null\n   * @return new instance of {@link ContentValues}\n   *\/\n  public ContentValues getContentValues(Language bo) {\n    ContentValues contentValues = new ContentValues();\n\n    if (bo.getCountryId() != null) {\n      contentValues.put(COL_COUNTRY_ID, bo.getCountryId());\n    }\n    if (bo.getLanguageId() != null) {\n      contentValues.put(COL_LANGUAGE_ID, bo.getLanguageId());\n    }\n    contentValues.put(COL_DESCRIPTION, bo.getDescription());\n    contentValues.put(COL_FLAG, bo.getFlag());\n    contentValues.put(COL_NAME, bo.getName());\n    return contentValues;\n  }\n\n  \/**\n   * Sets all attributes from the cursor\n   * @param cursorFrom the cursor to read from\n   * @param bo may be null\n   * @return the bo passed as a parameter or a new instance\n   *\/\n  public Language readFromCursor(Cursor cursorFrom, Language bo)\n  {\n    if (bo == null) {\n      bo = new Language();\n    }\n    final Cursor c = cursorFrom; \n\n    bo.setCountryId(c.getString(c.getColumnIndex(COL_COUNTRY_ID)));\n    bo.setLanguageId(c.getString(c.getColumnIndex(COL_LANGUAGE_ID)));\n    bo.setDescription(c.getString(c.getColumnIndex(COL_DESCRIPTION)));\n    bo.setFlag(c.getString(c.getColumnIndex(COL_FLAG)));\n    bo.setName(c.getString(c.getColumnIndex(COL_NAME)));\n    return bo;\n  }\n  \n  \/**\n   * @return hard-coded table creation scripts\n   *\/\n  public List&lt;String&gt; getTableScripts() {\n    List&lt;String&gt; result = new ArrayList&lt;String&gt;();\n    result.add(SQL_CREATE_TABLE_LANGUAGE); \n    return result;\n  }\n  \/\/@end seife autogenerated]\n}\n<\/pre>\n<p><\/li><\/ul><\/div><\/div>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beide Annotationen&nbsp;@SeifeClass&nbsp;und @SeifeField&nbsp;haben ein Versionsattribut. Es definiert ab welcher Modellversion das BO oder Datenfeld erstmals verf\u00fcgbar war. Wann immer die App von einer vorherigen Datenbankversion aktualisiert wird, werden die n\u00f6tigen Tabellenskripte ausgef\u00fchrt um auf das neueste Modell zu migrieren. Dies geschieht mit dem von Android empfohlenen Standard mechanismus SQLOpenHelper. Das Gleiche funktioniert f\u00fcr mit &nbsp;@SeifeField&nbsp;annotierte &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/\"> <span class=\"screen-reader-text\">Versionierung von Tabellen und Spalten<\/span> Weiterlesen &raquo;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":62,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.5.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Versionierung von Tabellen und Spalten - UC Mobile Apps<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#organization\",\"name\":\"UC Mobile Apps\",\"url\":\"http:\/\/uc-mobileapps.com\/de\/\",\"sameAs\":[],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#logo\",\"inLanguage\":\"de-DE\",\"url\":\"http:\/\/uc-mobileapps.com\/de\/wp-content\/uploads\/sites\/2\/2018\/07\/cropped-UC-Logo.png\",\"contentUrl\":\"http:\/\/uc-mobileapps.com\/de\/wp-content\/uploads\/sites\/2\/2018\/07\/cropped-UC-Logo.png\",\"width\":512,\"height\":512,\"caption\":\"UC Mobile Apps\"},\"image\":{\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#website\",\"url\":\"http:\/\/uc-mobileapps.com\/de\/\",\"name\":\"UC Mobile Apps\",\"description\":\"Innovative Softwareentwicklung und mobile Anwendungen\",\"publisher\":{\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/uc-mobileapps.com\/de\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#webpage\",\"url\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/\",\"name\":\"Versionierung von Tabellen und Spalten - UC Mobile Apps\",\"isPartOf\":{\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#website\"},\"datePublished\":\"2017-03-22T22:50:07+00:00\",\"dateModified\":\"2021-01-30T13:10:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/uc-mobileapps.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android Code Generator f\u00fcr SQLite and DataProvider Schnittstellen\",\"item\":\"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Versionierung von Tabellen und Spalten\"}]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Versionierung von Tabellen und Spalten - UC Mobile Apps","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"4 Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"http:\/\/uc-mobileapps.com\/de\/#organization","name":"UC Mobile Apps","url":"http:\/\/uc-mobileapps.com\/de\/","sameAs":[],"logo":{"@type":"ImageObject","@id":"http:\/\/uc-mobileapps.com\/de\/#logo","inLanguage":"de-DE","url":"http:\/\/uc-mobileapps.com\/de\/wp-content\/uploads\/sites\/2\/2018\/07\/cropped-UC-Logo.png","contentUrl":"http:\/\/uc-mobileapps.com\/de\/wp-content\/uploads\/sites\/2\/2018\/07\/cropped-UC-Logo.png","width":512,"height":512,"caption":"UC Mobile Apps"},"image":{"@id":"http:\/\/uc-mobileapps.com\/de\/#logo"}},{"@type":"WebSite","@id":"http:\/\/uc-mobileapps.com\/de\/#website","url":"http:\/\/uc-mobileapps.com\/de\/","name":"UC Mobile Apps","description":"Innovative Softwareentwicklung und mobile Anwendungen","publisher":{"@id":"http:\/\/uc-mobileapps.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/uc-mobileapps.com\/de\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de-DE"},{"@type":"WebPage","@id":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#webpage","url":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/","name":"Versionierung von Tabellen und Spalten - UC Mobile Apps","isPartOf":{"@id":"http:\/\/uc-mobileapps.com\/de\/#website"},"datePublished":"2017-03-22T22:50:07+00:00","dateModified":"2021-01-30T13:10:09+00:00","breadcrumb":{"@id":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/sqlite-versionierung-von-tabellen-tabellenspalten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/uc-mobileapps.com\/de\/"},{"@type":"ListItem","position":2,"name":"Android Code Generator f\u00fcr SQLite and DataProvider Schnittstellen","item":"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/"},{"@type":"ListItem","position":3,"name":"Versionierung von Tabellen und Spalten"}]}]}},"_links":{"self":[{"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/137"}],"collection":[{"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/comments?post=137"}],"version-history":[{"count":15,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/137\/revisions"}],"predecessor-version":[{"id":367,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/137\/revisions\/367"}],"up":[{"embeddable":true,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/62"}],"wp:attachment":[{"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/media?parent=137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}