{"id":145,"date":"2017-03-23T00:19:35","date_gmt":"2017-03-22T23:19:35","guid":{"rendered":"http:\/\/uc-mobileapps.com\/de\/?page_id=145"},"modified":"2021-01-30T14:08:17","modified_gmt":"2021-01-30T13:08:17","slug":"fremdschluessel","status":"publish","type":"page","link":"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/","title":{"rendered":"Fremdschl\u00fcssel"},"content":{"rendered":"<p>Wie im ersten Beispiel gezeigt kann ein Fremdschl\u00fcssel in einer Bestellung die zum Kunden verweist wie folgt definiert werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/**\n * The foreign key field 'fkField' refers to {@link #customer},\n * it will be set via {@link #setCustomer(Customer)}.\n *\/\n@SeifeField(foreignKey = @ForeignkeyDef(fkField = \"customer\", refKeyField=\"id\", refClass=Customer.class))\nprivate Long customerId;\n\nprivate Customer customer;<\/pre>\n<p>Das Attribut&nbsp;<code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">foreignKey = @ForeignkeyDef( \/* .. *\/ )<\/code>&nbsp;definiert die Eigenschaft der Tabellenreferenz.<\/p>\n<ul>\n<li><code class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">fkField<\/code><br \/>\nbezeichnet den Namen des Feldes zur Instanzreferenz private Customer customer das der generierte Code nutzt wenn die Referenz aufgel\u00f6st wird<\/li>\n<li><code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">refKeyField<\/code><br \/>\nbezeichnet den Prim\u00e4rschl\u00fcsselteil auf das dieses Feld referenziert, der Datentyp muss \u00fcbereinstimmen<\/li>\n<li><code class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">refClass<\/code><br \/>\ndefiniert den Typ der Instanzreferenz<\/li>\n<\/ul>\n<p>Der Mechanismus ist so einfach wie m\u00f6glich gehalten. Es ist keine zus\u00e4tzliche Bibliothek als Zwischenschicht erforderlich und es werden keine generischen Datentypen oder spezielle Collections benutzt.<br \/>\nEs wird einfacher Android Quelltext&nbsp;basierend auf Vorlagen generiert, der leicht zu lesen ist da die Fremdschl\u00fcssel-Definitionen \u00e4hnlich und selbsterkl\u00e4rend sind.<\/p>\n<p>Der generierte SchemaPeer hat die korrekten SQL foreign-key Referenzen definiert, jedoch wird nicht automatisch ein Index dazu erzeugt. (Siehe dazu <a href=\"https:\/\/sqlite.org\/foreignkeys.html\" target=\"_blank\" rel=\"noopener\">SQLite documentation<\/a> oder z.B. diese Frage auf&nbsp;<a href=\"http:\/\/stackoverflow.com\/questions\/955135\/foreign-key-optimization-in-sqlite\" target=\"_blank\" rel=\"noopener\">StackOverflow<\/a>)<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\/**\n * Table creation script\n *\/\nprivate static final String SQL_CREATE_TABLE_ORDER =\n    \"create table \" + TBL_ORDER + \" (\" + \n        COL_ID + \" integer primary key autoincrement,\" +\n        COL_FK_CUSTOMER_CUSTOMER_ID + \" integer,\" +\n        COL_ORDER_DATE + \" integer not null\" +\n        \", \" +\n        \" FOREIGN KEY(\" + COL_FK_CUSTOMER_CUSTOMER_ID  + \")\" +\n        \" REFERENCES \" + CustomerSchema.TBL_CUSTOMER \n        +\"(\" + CustomerSchema.COL_ID  + \")\" +\t\t\t \t\t\n        \")\";\n<\/pre>\n<h4>Referenzierung von zusammengesetzten Prim\u00e4rschl\u00fcsseln<\/h4>\n<p>Wenn der Fremdschl\u00fcssel auf ein eindeutiges Tuple von Spalten verweist, also technisch korrekt ist, so kann es auch modelliert werden. Dazu werden alle technischen Schl\u00fcsselteile in fkField mit dem gleichen Instanznamen konfiguriert.<br \/>\nDie folgende Klasse &#8216;Language&#8217; hat einen zusammengesetzten Prim\u00e4rschl\u00fcssel bestehend aus Land und Sprache<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeClass(sqlTablename=\"locale\", version=2, generatorOptions={GeneratorOption.BOCLASS, GeneratorOption.SCHEMA_PEER})\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  \/\/ ..\n}<\/pre>\n<p>Der Fremdschl\u00fcssel wird dann wie unten defniniert, jeweils ein technisches Feld f\u00fcr die Referenzen und ein Instanzfeld &#8220;Language&#8221; auf das beides Mal in fkField eingetragen wird. Diesesmal wird wie oben schon erw\u00e4hnt auch ein Index &#8216;locale&#8217; erstellt.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">@SeifeClass(generatorOptions={GeneratorOption.BOCLASS_PARCELABLE, GeneratorOption.SCHEMA_PEER, GeneratorOption.DB_HELPER+\"=LocaleOpenHelper\", \n    GeneratorOption.DATA_PROVIDER+\"=LocaleProvider\"})\npublic class LocaleData {\n\n  private Language language;\n\n  @SeifeField(\n      foreignKey = @ForeignkeyDef(fkField=\"language\", refKeyField=\"countryId\", refClass=Language.class),\n          sqlOptions=@SqlFieldOptions(sqlIndex=\"locale\"))\n  private String countryId;\n  \n  @SeifeField(\n      foreignKey = @ForeignkeyDef(fkField=\"language\", refKeyField=\"languageId\", refClass=Language.class),\n          sqlOptions=@SqlFieldOptions(sqlIndex=\"locale\"))\n  private String languageId;\n  \n  @Id\n  @GeneratedValue(strategy=GenerationType.AUTO)\n  @SeifeField(isPrimaryKey=true, sqlOptions=@SqlFieldOptions(sqlColumn=\"_id\"))\n  private int id;\n  \/\/ ..\n}<\/pre>\n<p>Das erzeugte Skript f\u00fcr die Tabelle im LocaleOpenHelper enth\u00e4lt dann die definierte Fremdschl\u00fcsselreferenz und es existiert eine SQL-Index Definition.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">private static final String SQL_CREATE_TABLE_LOCALE_DATA =\n    \"create table \" + TBL_LOCALE_DATA + \" (\" + \n        COL_ID + \" integer primary key autoincrement,\" +\n        COL_FK_LANGUAGE_COUNTRY_ID + \" text,\" +\n        COL_FK_LANGUAGE_LANGUAGE_ID + \" text\" +\n        \", \" +\n        \" FOREIGN KEY(\" + COL_FK_LANGUAGE_COUNTRY_ID + \",\" + COL_FK_LANGUAGE_LANGUAGE_ID  + \")\" +\n        \" REFERENCES \" + LanguageSchema.TBL_LANGUAGE \n        +\"(\" + LanguageSchema.COL_COUNTRY_ID + \",\" + LanguageSchema.COL_LANGUAGE_ID  + \")\" +\t\t\t \t\t\n        \")\";\n\n  \/**\n   * Index for locale\n   *\/\n  public static final String SQL_CREATE_IDX_LOCALE_DATA_LOCALE = \n      \"create index if not exists \"\n          + TBL_LOCALE_DATA\n          + \"_idx_locale ON \" + TBL_LOCALE_DATA\n          + \"(\" + COL_FK_LANGUAGE_COUNTRY_ID + \",\" + COL_FK_LANGUAGE_LANGUAGE_ID + \")\";\n<\/pre>\n<h4>Versionierung<\/h4>\n<p>Wie im Abschnitt zur Versionierung von Tabellen beschrieben, werden auch der Fremdschl\u00fcssel und der Tabellenindex in der Upgrade Logik mit ber\u00fccksichtigt. Im Beispiel ist der Foreign Key in Version 2 hinzugekommen;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">private Language language;\n\n@SeifeField(\n    foreignKey = @ForeignkeyDef(fkField=\"language\", refKeyField=\"countryId\", refClass=Language.class),\n        sqlOptions=@SqlFieldOptions(sqlIndex=\"locale\"), version=2)\nprivate String countryId;\n\n@SeifeField(\n    foreignKey = @ForeignkeyDef(fkField=\"language\", refKeyField=\"languageId\", refClass=Language.class),\n        sqlOptions=@SqlFieldOptions(sqlIndex=\"locale\"), version=2)\nprivate String languageId;\n<\/pre>\n<p>Der Programmteil wird dann neben der Erstellung der neuen Spalten auch das SQL_CREATE_IDX_LOCALE_DATA_LOCALE script ausf\u00fchren.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">if (oldVersion &lt; 2 &amp;&amp; newVersion &gt;= 2) { \n  db.execSQL(\"ALTER TABLE \" + LocaleDataSchema.TBL_LOCALE_DATA + \" ADD COLUMN \" + LocaleDataSchema.COL_FK_LANGUAGE_COUNTRY_ID + \" text\");\n  db.execSQL(\"ALTER TABLE \" + LocaleDataSchema.TBL_LOCALE_DATA + \" ADD COLUMN \" + LocaleDataSchema.COL_FK_LANGUAGE_LANGUAGE_ID + \" text\");\n  db.execSQL(LocaleDataSchema.SQL_CREATE_IDX_LOCALE_DATA_LOCALE);\n}\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie im ersten Beispiel gezeigt kann ein Fremdschl\u00fcssel in einer Bestellung die zum Kunden verweist wie folgt definiert werden: \/** * The foreign key field &#8216;fkField&#8217; refers to {@link #customer}, * it will be set via {@link #setCustomer(Customer)}. *\/ @SeifeField(foreignKey = @ForeignkeyDef(fkField = &#8220;customer&#8221;, refKeyField=&#8221;id&#8221;, refClass=Customer.class)) private Long customerId; private Customer customer; Das Attribut&nbsp;foreignKey = &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/\"> <span class=\"screen-reader-text\">Fremdschl\u00fcssel<\/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>Fremdschl\u00fcssel - 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\/fremdschluessel\/\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 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\/fremdschluessel\/#webpage\",\"url\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/\",\"name\":\"Fremdschl\u00fcssel - UC Mobile Apps\",\"isPartOf\":{\"@id\":\"http:\/\/uc-mobileapps.com\/de\/#website\"},\"datePublished\":\"2017-03-22T23:19:35+00:00\",\"dateModified\":\"2021-01-30T13:08:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/#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\":\"Fremdschl\u00fcssel\"}]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fremdschl\u00fcssel - 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\/fremdschluessel\/","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"3 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\/fremdschluessel\/#webpage","url":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/","name":"Fremdschl\u00fcssel - UC Mobile Apps","isPartOf":{"@id":"http:\/\/uc-mobileapps.com\/de\/#website"},"datePublished":"2017-03-22T23:19:35+00:00","dateModified":"2021-01-30T13:08:17+00:00","breadcrumb":{"@id":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/uc-mobileapps.com\/de\/android-sqlite-dataprovider-code-generator\/fremdschluessel\/#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":"Fremdschl\u00fcssel"}]}]}},"_links":{"self":[{"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/145"}],"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=145"}],"version-history":[{"count":5,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/145\/revisions"}],"predecessor-version":[{"id":365,"href":"http:\/\/uc-mobileapps.com\/de\/wp-json\/wp\/v2\/pages\/145\/revisions\/365"}],"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=145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}