⟵ zur Projektübericht
Motivation
Der ADFC-Stormarn e.V. verwendet Klebeetiketten zur Codierung
von Fahrrädern.

Auf diesen Etiketten ist ein EIN-Code
(Eigentümer-Identifizierungs-Nummer) aufgedruckt, die es der Polizei,
den Fundbüros und dem ADFC erlauben, den Eigentümer eines Fahrrads zu ermitteln. Eine über aufgeklebte Etikett angebrachte
Plombierfolie schützt dieses vor dem Ablösen.

Dieses Verfahren eignet sich auch für andere Gegenstände, wie Kameras, Fahrrad-Akkus, Kinderwagen, Pferdesättel,
etc.
Die Codier-Aktionen finden häufig j.w.d. statt und nicht immer gibt es dort einen verlässlichen Zugang zum Internet.
Die Daten zur Generierung der EIN-Codes werden deshalb in einer lokal zur Verfügung stehenden SQLite-Datenbank abgelegt.
Diese Seite beschreibt die Extension für den MIT App Inventor zum Zugriff auf die Datenbank.
Version |
Anpassungen |
1.0 (2025-01-23) |
Initiale Version |
Über die App Inventor Erweiterung (Extension) UrsAI2SQLiteEIN
Viele Funktionen lassen sich mit den Standardkomponenten des App Inventor entwickeln. Häufig ist die dazu aufzubauende
Blockstruktur sehr komplex. Die Formulierung der gleichen Lösung ist, wenn man sie in JAVA formuliert, meist deutlich
einfacher und übersichtlicher. Über ein Extension-Programm kann man selbst geschriebenen JAVA-Code in eine App-Inventor-App
integrieren.
Die hier beschriebene Extension UrsAI2SQLiteEIN ist speziell für die Bedürfnisse
des Allgemeinen Deutsche Fahrrad-Club (ADFC) zugeschnitten. Dennoch
werden hier einige Verfahren aufgezeigt, die auch für andere Anwendungen nützlich sein können.
- Pfad-Angaben bei interner Methode openInputStream (öffentliche Methode
InsertFile) behoben (siehe
https://community.appinventor.mit.edu/t/some-basics-on-android-storage-system/21556
- Methode InsertBulk hinzugfügt
- Event SQLError wird asynchron ausgelöst
- Interne Methode debugException so angepasst, dass einheitlich das Ereignis
SQLError ausgelöst wird.
- Methoden InsertFile und
InsertFileAsync um Parameter Separator ergänzt.
In beiden Methoden die Regular Expression im Aufruf von String.split überarbeitet.
Separator im String führte zu Problemen. Anführungszeichen zu Beginn und Ende eines CSV-Elements werden entfernt.
-
Methode ExecSQL hinzugefügt
(wie Execute ohne Parameter
bindParams).
- Methode ExecSelect hinzugefügt (wie
SelectSQL ohne Parameter bindParams).
- Die Select-Anweisungen liefern eine YailList. Die einzelnen Items (Zeilen)
der Liste sind jedoch eine ArrayList. So geändert, dass die Zeilen auch eine
YailList sind (interne Methode cursorToList).
Referenz
Eigenschaften
- _ListGemeideLength
- Anzahl Gemeinden, die von _Gemeinden zurück geliefert werden soll.
- _ListSimilarLength
- Anzahl Straßen, die von _getSimilarStrasse max. zurück geliefert werden soll.
- DBName
- Specifies the name of the database.
- DBVersion
- Legt den Namen der Datenbank fest.
- DebugDialog
- Legt fest, ob Debug-Meldungen in Dialogfeldern angezeigt werden sollen.
- DebugToast
- Legt fest, ob Debug-Meldungen als Toast-Meldungen angezeigt werden sollen.
- ReturnColumnNames
- Gibt an, ob Ergebnislisten Spaltennamen enthalten sollen. Weitere Informationen finden Sie in den Abfrageblöcken.
- Version
- Liefert die Versionsnummer der Extension.
- VersionSDK
- Gibt die Version des Android SDK zurück.
Funktionen
- _Capitalize (Name)
- Ersetzt den ersten Buchstaben durch einen Großbuchstaben.
- _checkStrassenName (StrName)
- Prüft, ob der Straßenname mit 'str', 'str.' oder 'strasse' endet.
- _CopyDB (AssetFileName)
- Kopiert eine Datei aus dem Asset-Speicher ins DB-Verzeichnis
- _CopyUpdatesToClipBoard ()
- Kopiert die Inhalte der Tabelle DataUpdate in die Zwischenablage.
- _ExportUpdates ()
- Exportiert die Tabelle DataUpdate in die Datei '/DOWNLOAD/EIN-Update.txt'.
- _Gemeinden (Pattern)
- Liefert eine Gemeindeliste
- _getDataVersion ()
- Liefert die Versionsnummer des Datenbank-Inhalts.
- _getGemeinde (Kfz, GemSchl)
- Liefert den Gemeindenamen zum EIN-Gemeindeschlüssel. Liefert "---", wenn kein passender Datensatz gefunden
wurde.
- _getGemSchl (GemID)
- Liefert den Gemeindeschlüssel zur Gemeinde.
- _getKfz (GemID)
- Liefert das Kfz-Kennzeichen zur Gemeinde.
- _getKreis (GemID)
- Liefert den Kreisnamen zur Gemeinde.
- _getKreisFromKfz (Kfz)
- Liefert den Kreisnamen zum Kfz-Kennzeichen. Liefert "---", wenn kein passender Datensatz gefunden
wurde.
- _getLand (GemID)
- Liefert den Ländernamen zur Gemeinde.
- _getLandFromKfz (Kfz)
- Liefert den Ländernamen zum Kfz-Kennzeichen. Liefert "---", wenn kein passender Datensatz gefunden wurde.
- _getSchemaVersion ()
- Liefert die Versionsnummer des Datenbank-Schemas.
- _getSimilarStrasse (GemID,
StrName, Distance)
- Liefert die Versionnummer des Datenbank-Inhalts.
- _getStrasse (Kfz, GemSchl,
StrSchl)
- Liefert den Straßennamen zum EIN-Straßenschlüssel. Liefert "---", wenn kein passender Datensatz gefunden
wurde.
- _getStrasseFromStrSchl (GemID,
StrSchl)
- Liefert den Straßennamen zum EIN-Straßenschlüssel.
- _getStrSchl (StrID)
- Liefert den Straßenschlüssel zur Straße.
- _GetUpdateCount ()
- Liefert die Anzahl der in der Tabelle DataUpdate enthaltenen Datensätze.
- _GetUpdates ()
- Liefert die Inhalte der Tabelle DataUpdate.
- _InsertStraße (GemID, Ortsteil,
Strasse, StrSchl)
- Liefert den Straßenschlüssel zur Straße.
- _SendUpdates (MailAddress)
- Versendet die Inhalte der Tabelle DataUpdate per E-Mail.
- _Strassen (Pattern, GemID,
Limit)
- Liefert eine Gemeindeliste
- AppVersionCode ()
- Liefert den Versionscode der App, in die diese Extension eingebunden ist.
- AppVersionName ()
- Liefert den Versionsnamen der App, in die diese Extension eingebunden ist..
- BeginTransaction ()
- Startet eine Transaktion in einer geöffneten Datenbank. Verschachtelte Transaktionen werden unterstützt.
- CloseDatabase ()
- Schließt die Datenbank. Wenn die Datenbank bereits geschlossen ist, geschieht nichts. Alle nicht festgeschriebenen
Transaktionen werden zurückgesetzt.
- CommitTransaction ()
- Schließt die letzte offene Transaktion ab.
- DatabaseExists ()
- Gibt true zurück, wenn die Datenbankdatei existiert, andernfalls
false.
- DatabasePath ()
- Gibt den vollständigen Pfad zur Datenbank zurück, auch wenn diese noch nicht existiert.
- Delete (table, whereClause,
bindParams)
- Führt eine SQL DELETE-Anweisung aus. Die WHERE-Klausel ist optional. Wenn keine where-Klausel angegeben ist,
werden alle Zeilen in der Tabelle gelöscht. Jeder Bind-Parameter ersetzt das entsprechende „?“ in der WHERE-Klausel.
Gibt die Anzahl der betroffenen Zeilen zurück, wenn eine WHERE-Klausel übergeben wird, andernfalls 0. Wenn ein Fehler
auftritt oder die Datenbank nicht geöffnet ist, wird -1 zurückgegeben.
- DeleteAsync (tag, table,
whereClause, bindParams)
- Führt eine SQL DELETE-Anweisung asynchron aus. tag identifiziert das Ergebnis
dieses Aufrufs im AfterDelete-Ereignis. Weitere Informationen finden Sie unter
Delete.
- DeleteDatabase ()
- Löscht eine geschlossene Datenbank. Dadurch wird die Datenbankdatei dauerhaft gelöscht.
- ExecSelect (sql)
- Führt eine einzelne SQL SELECT-Anweisung aus und gibt eine Liste von Datensätzen zurück. Wenn nur eine einzelne
Spalte ausgewählt wird, ist jedes Element in der zurückgegebenen Liste der Wert dieser Spalte für jede Ergebniszeile.
Wenn mehrere Spalten ausgewählt werden, ist jedes Element der zurückgegebenen Liste selbst eine Liste von Werten
für jede ausgewählte Spalte. Wenn die Option ReturnColumnNames auf
true gesetzt ist, ist jeder Spaltenwert eine Liste mit zwei Elementen, wobei das
erste Element der Spaltenname und das zweite Element der Spaltenwert ist. Wenn die Datenbank nicht geöffnet ist,
wird eine leere Liste zurückgegeben..
- ExecSQL (sql)
- Führt eine einzelne SQL-Anweisung aus, die keine SELECT-Anweisung ist. Wenn die Datenbank nicht
geöffnet ist, wird false zurückgegeben.
- Execute (sql, bindParams)
- Führt eine einzelne, parametrisierte SQL-Anweisung aus, die keine SELECT-Anweisung ist, und
gibt zurück, ob sie erfolgreich war oder nicht. Jeder Bind-Parameter ersetzt das entsprechende „?“ in der WHERE-Klausel
der Abfrage. Wenn die Datenbank nicht geöffnet ist, wird false zurückgegeben.
- ExecuteAsync (tag, sql,
bindParams)
- Führt eine einzelne, parametrisierte SQL-Anweisung asynchron aus, die keine SELECT-Anweisung
ist, und gibt zurück, ob sie erfolgreich war oder nicht. Tag identifiziert das
Ergebnis dieses Aufrufs im AfterExecute-Ereignis.
Weitere Informationen unter Execute.
- ExecuteFile (fileName)
- Führt mehrere SQL-Anweisungen aus einer Datei aus und gibt die Anzahl der erfolgreich ausgeführten Anweisungen
zurück. Jede Zeile der Datei sollte eine vollständige Nicht-SELECT-SQL-Anweisung sein, optional
gefolgt von einem Semikolon. Einzeilige (--) und mehrzeilige (/*...*/) Kommentare werden ignoriert. Zeilenfortsetzung
mit '\' wird unterstützt. '\n' wird durch tatsächliche Zeilenumbrüche ersetzt. Die Ausführung wird beim ersten Fehler
beendet. Wenn die Datenbank nicht geöffnet ist, wird -1 zurückgegeben. Stellen Sie dem Dateinamen ein / voran, um
aus einer bestimmten Datei auf der SD-Karte zu lesen. Um mit einer Anwendung gepackte Assets zu lesen (funktioniert
auch für den Companion), beginnen Sie den Dateinamen mit // (zwei Schrägstriche). Wenn ein Dateiname nicht mit einem
Schrägstrich beginnt, wird er aus dem privaten Speicher der Anwendung (für gepackte Apps) und für den Companion
aus /sdcard/AppInventor/data gelesen.
- ExecuteFileAsync (tag, fileName)
- Führt mehrere SQL-Anweisungen aus einer Datei asynchron aus. tag identifiziert
das Ergebnis dieses Aufrufs im AfterExecute#AfterExecuteFileFile-Ereignis.
Weitere Informationen finden Sie unter ExecuteFile.
- ExportDatabase (fileName)
- Exportiert die aktuell geschlossene Datenbank in die angegebene Datei. Die resultierende Datei ist eine vollständige
SQLite-Datenbank. Gibt true zurück, wenn der Export erfolgreich war, andernfalls
false.
- ImportDatabase (fileName)
- Importiert eine SQLite-Datenbank und ersetzt damit vollständig die aktuell geschlossene Datenbank. Gibt
true zurück, wenn der Import erfolgreich war, andernfalls
false.
- Insert (table, columns,
values)
- Führt eine SQL INSERT-Anweisung aus. columns enthält eine Liste mit Spaltennamen.
values enthält eine Liste mit Spaltenwerten. Gibt die Zeilen-ID der neu eingefügten
Zeile zurück. Wenn ein Fehler auftritt oder die Datenbank nicht geöffnet ist, wird -1 zurückgegeben.
- InsertAsync (tag, table,
columns, values)
- Führt eine SQL INSERT-Anweisung asynchron aus. tag identifiziert das Ergebnis
dieses Aufrufs im AfterInsert-Ereignis. Weitere Informationen
unter Insert.
- InsertBulk (Table, Data,
Separator)
- Fügt mehrere Zeilen mit Daten aus einer mehrzeiligen Zeichenfolge in eine Tabelle ein. Die erste Zeile der Zeichenfolge
sollte eine CSV-Liste der Spaltennamen sein. Jede der folgenden Zeilen sollte eine CSV-Liste mit Werten für jede
neue Zeile sein. Leere Zeilen werden ignoriert. Zeilenfortsetzung mit „\“ wird unterstützt. „\n“ wird durch tatsächliche
Zeilenumbrüche ersetzt. Die Einfügung wird beim ersten Fehler beendet. Wenn die Datenbank nicht geöffnet ist, wird
-1 zurückgegeben.
- InsertFile (table, fileName,
Separator)
- Fügt mehrere Zeilen mit Daten aus einer Datei in eine Tabelle ein. Die erste Zeile der Datei sollte eine CSV-Liste
der Spaltennamen sein. Jede der folgenden Zeilen sollte eine CSV-Liste mit Werten für jede neue Zeile sein. Leere
Zeilen werden ignoriert. Zeilenfortsetzung mit '\' wird unterstützt. '\n' wird durch tatsächliche Zeilenumbrüche
ersetzt. Das Einfügen wird beim ersten Fehler beendet. Wenn die Datenbank nicht geöffnet ist, wird -1 zurückgegeben.
Stellen Sie dem Dateinamen ein / voran, um aus einer bestimmten Datei auf der SD-Karte zu lesen. Um mit einer Anwendung
gepackte Assets zu lesen (funktioniert auch für den Companion), beginnen Sie den Dateinamen mit // (zwei Schrägstriche).
Wenn ein Dateiname nicht mit einem Schrägstrich beginnt, wird er aus dem privaten Speicher der Anwendung (für gepackte
Apps) und für den Companion aus /sdcard/AppInventor/data gelesen.
- InsertFileAsync (tag, table,
fileName, Separator)
- Fügt mehrere Zeilen mit Daten aus einer Datei asynchron in eine Tabelle ein. tag
identifiziert das Ergebnis dieses Aufrufs im Ereignis AfterInsertFile.
Weitere Informationen unter InsertFile.
- IsDatabaseOpen ()
- Gibt true zurück, wenn die Datenbank geöffnet ist, andernfalls
false.
- OpenDatabase ()
- Öffnet die Datenbank. Wenn die Datenbank bereits geöffnet ist, geschieht weiter nichts.
- Replace (table, columns,
values)
- Führt eine SQL REPLACE-Anweisung aus. columns enthält eine Liste mit Spaltennamen.
values enthält eine Liste mit Spaltenwerten. Gibt die Zeilen-ID der neu eingefügten
oder aktualisierten Zeile zurück. Wenn ein Fehler auftritt oder die Datenbank nicht geöffnet ist, wird -1 zurückgegeben.
- ReplaceAsync (tag, table,
columns, values)
- Führt eine SQL REPLACE-Anweisung asynchron aus. tag identifiziert das Ergebnis
dieses Aufrufs im AfterReplace-Ereignis. Weitere Informationen
unter Replace.
- RollbackTransaction ()
- Rollt die zuletzt geöffnete Transaktion zurück.
- Select (table, distinct,
columns, whereClause, bindParams,
groupBy, having, orderBy, limit)
- Führt eine SQL SELECT-Anweisung aus. whereClause ist optional. Wenn keine
whereClause angegeben ist, werden alle Zeilen der Tabelle zurückgegeben. Jeder
Bind-Parameter ersetzt das entsprechende „?“ in whereClause.
groupBy ist optional. Wenn nicht angegeben, wird keine Gruppierung durchgeführt.
having ist optional. Wenn nicht angegeben, werden alle Zeilengruppen zurückgegeben.
orderBy ist optional. Wenn nicht angegeben, werden die Zeilen ungeordnet zurückgegeben.
limit ist optional. Wenn nicht angegeben, werden alle übereinstimmenden Zeilen
zurückgegeben. Wenn nur eine einzelne Spalte ausgewählt wird, ist jedes Element in der zurückgegebenen Liste der
Wert dieser Spalte für jede Ergebniszeile. Wenn mehrere Spalten ausgewählt werden, ist jedes Element der zurückgegebenen
Liste selbst eine Liste von Werten für jede ausgewählte Spalte. Wenn die Option ReturnColumnNames
auf true gesetzt ist, ist jeder Spaltenwert eine Liste mit zwei Elementen, wobei
das erste Element der Spaltenname und das zweite Element der Spaltenwert ist.
- SelectAsync (tag, table,
distinct, columns, whereClause,
bindParams, groupBy, having,
orderBy, limit)
- Führt eine SQL SELECT-Anweisung asynchron aus. tag identifiziert das Ergebnis
dieses Aufrufs im AfterSelect-Ereignis. Weitere Informationen
unter Select.
- SelectSQL (sql, bindParams)
- Führt eine einzelne, parametrisierte SQL SELECT-Anweisung aus und gibt eine Liste von Datensätzen zurück. Jeder
Bind-Parameter ersetzt das entsprechende „?“ in der WHERE-Klausel der Abfrage. Wenn nur eine einzelne Spalte ausgewählt
wird, ist jedes Element in der zurückgegebenen Liste der Wert dieser Spalte für jede Ergebniszeile. Wenn mehrere
Spalten ausgewählt werden, ist jedes Element der zurückgegebenen Liste selbst eine Liste von Werten für jede ausgewählte
Spalte. Wenn die Option ReturnColumnNames auf true
gesetzt ist, ist jeder Spaltenwert eine Liste mit zwei Elementen, wobei das erste Element der Spaltenname und das
zweite Element der Spaltenwert ist. Wenn die Datenbank nicht geöffnet ist, wird eine leere Liste zurückgegeben.
- SelectSQLAsync (tag, sql,
bindParams)
- Führt eine einzelne, parametrisierte SQL SELECT-Anweisung asynchron aus. tag
identifiziert das Ergebnis dieses Aufrufs im AfterSelect-Ereignis.
Weitere Informationen unter SelectSQL.
- TableCount ()
- Gibt die Anzahl der Tabellen in der Datenbank zurück oder -1, wenn ein Fehler auftritt oder die Datenbank nicht
geöffnet ist.
- TableExists (table)
- Gibt true zurück, wenn die Tabelle in der Datenbank vorhanden ist, oder
false, wenn die Tabelle nicht vorhanden ist, ein Fehler auftritt oder die Datenbank
nicht geöffnet ist.
- TableNames ()
- Gibt eine Liste mit den Namen der Tabellen in der Datenbank zurück oder eine leere Liste, wenn ein Fehler auftritt
oder die Datenbank nicht geöffnet ist.
- TableRowCount (table)
- Gibt die Anzahl der Zeilen in einer Tabelle zurück oder -1, wenn ein Fehler auftritt oder die Datenbank nicht
geöffnet ist.
- Update (table, columns,
values, whereClause, bindParams)
- Führt eine SQL UPDATE-Anweisung aus. columns enthält eine Liste mit Spaltennamen.
values enthält eine Liste mit Spaltenwerten. whereClause
ist optional. Wenn whereClause nicht angegeben ist, werden alle Zeilen in der
Tabelle aktualisiert. Jeder Bind-Parameter ersetzt das entsprechende „?“ in whereClause.
Gibt die Anzahl der betroffenen Zeilen zurück. Wenn ein Fehler auftritt oder die Datenbank nicht geöffnet ist, wird
-1 zurückgegeben.
- UpdateAsync (tag, table,
columns, values, whereClause,
bindParams)
- Führt eine SQL UPDATE-Anweisung asynchron aus. tag identifiziert das Ergebnis
dieses Aufrufs im AfterUpdate-Ereignis. Weitere Informationen
unter Update.
Ereignisse
- AfterDelete (tag, rowCount)
- Dieses Ereignis wird nach einem asynchronen Delete-Aufruf ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und die Anzahl der gelöschten Zeilen werden bereitgestellt.
- AfterExecute (tag, result)
- Dieses Ereignis wird nach einem Aufruf von ExecuteSQLAsync ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und das Ergebnis der Ausführung werden bereitgestellt.
- AfterExecuteFile (tag, execCount)
- Dieses Ereignis wird nach einem ExecuteFileAsync ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und das Ergebnis der Ausführung werden bereitgestellt.
- AfterInsert (tag, rowId)
- Dieses Ereignis wird nach einem asynchronen Insert-Aufruf ausgelöst. Das im ursprünglichen Aufruf angegebene
Tag und die Zeilen-ID der neuen Zeile werden bereitgestellt.
- AfterInsertFile (tag, rowCount)
- Dieses Ereignis wird nach einem asynchronen InsertFile-Aufruf ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und die Anzahl der eingefügten Zeilen werden bereitgestellt.
- AfterReplace (tag, rowId)
- Dieses Ereignis wird nach einem asynchronen Replace-Aufruf ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und die Zeilen-ID der neuen oder aktualisierten Zeile werden bereitgestellt.
- AfterSelect (tag, rowCount,
rows)
- Dieses Ereignis wird nach einem asynchronen Select-Aufruf ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert, die Anzahl der zurückgegebenen Zeilen und die Ergebniszeilen werden
bereitgestellt.
- AfterUpdate (tag, rowCount)
- Dieses Ereignis wird nach einem asynchronen Update-Aufruf ausgelöst. Der im ursprünglichen Aufruf angegebene
tag-Wert und die Anzahl der geänderten Zeilen werden bereitgestellt.
- DatabaseClosed ()
- Dieses Ereignis wird ausgelöst, wenn die Datenbank geschlossen wird.
- DatabaseCreated ()
- Dieses Ereignis wird ausgelöst, wenn die Datenbank erstellt wird.
- DatabaseDowngrade (oldVersion, newVersion)
- Dieses Ereignis wird ausgelöst, wenn die Datenbank heruntergestuft wird. Die vorherige und die neue Versionsnummer
werden angegeben. Verwenden Sie dieses Ereignis, um die Datenbank entsprechend der Versionsänderung anzupassen.
- DatabaseOpened ()
- Dieses Ereignis wird ausgelöst, wenn die Datenbank geöffnet wird.
- DatabaseUpgrade (oldVersion, newVersion)
- Dieses Ereignis wird ausgelöst, wenn die Datenbank aktualisiert wird. Die vorherige und die neue Versionsnummer
werden angegeben. Verwenden Sie dieses Ereignis, um die Datenbank entsprechend der Versionsänderung anzupassen.
- SQLError (message)
- Dieses Ereignis wird ausgelöst, wenn ein SQL-Fehler auftritt. Die Fehlermeldung wird ausgegeben..
Download
Die Quellen der Extension zum Download.