Mit Python in Android-Schnittstelle zu SQL
-
25-09-2019 - |
Frage
Ich weiß, dass Sie Python und andere Skriptsprachen in Android verwenden können. Aber ich habe nicht gesehen, Wetter oder nicht, es war möglich, Python als Schnittstelle zu SQLite in Android zu verwenden. Ist das möglich? Dies ist der erste Android-App, wo ich SQLite gebraucht habe, und mit dem Java api verzögert.
Wenn dies nicht möglich ist, kann jemand Punkt mich auf ein gutes Tutorial auf SQLite in Android? Ich habe ein paar gefunden, aber alle von ihnen sind ganz anders und ich bin total verloren, auf das der beste Weg, es zu tun.
Es ist nur schwer zu Bild wie erwartet google Sie die SQLite-Datenbank zu verwenden. Es scheint, wie Sie wie 10 verschiedene Klassen benötigen nur eine Datenbank abzufragen.
Lösung
Eigentlich brauchen Sie nur 3 Klassen:
Contentprovider , wie Sie hier: http://developer.android.com/guide/topics/providers/content-providers.html
Second Sie brauchen, ist ein SQLiteOpenHelper und last but not mindestens ein Cursor
Edit: Just bemerkte es von dem Schnipsel nicht klar ist, was die db
variabel ist. Es ist die SQLiteOpenHelper oder besser meine Erweiterung davon (wo ich nur die onCreate, ONUPGRADE und Konstruktor außer Kraft gesetzt habe. Siehe unten ^^
Die Contentprovider ist derjenige, der mit der Datenbank kommunizieren und tun, um die Einfügungen, Aktualisierungen, Löschungen. Der Content-Provider können auch andere Teile des Codes (auch andere Apps, wenn Sie es zulassen), um die Daten in der SQLite gespeichert sind.
Sie können dann überschreiben die Einfügen / Löschen / query / Update-Funktionen und fügen Sie Ihre Funktionalität, um es zum Beispiel verschiedene Aktionen ausführen auf der URI der Absicht abhängig.
public int delete(Uri uri, String whereClause, String[] whereArgs) {
int count = 0;
switch(URI_MATCHER.match(uri)){
case ITEMS:
// uri = content://com.yourname.yourapp.Items/item
// delete all rows
count = db.delete(TABLE_ITEMS, whereClause, whereArgs);
break;
case ITEMS_ID:
// uri = content://com.yourname.yourapp.Items/item/2
// delete the row with the id 2
String segment = uri.getPathSegments().get(1);
count = db.delete(TABLE_ITEMS,
Item.KEY_ITEM_ID +"="+segment
+(!TextUtils.isEmpty(whereClause)?" AND ("+whereClause+")":""),
whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown Uri: "+uri);
}
return count;
}
Die UriMatcher ist definiert als
private static final int ITEMS = 1;
private static final int ITEMS_ID = 2;
private static final String AUTHORITY_ITEMS ="com.yourname.yourapp.Items";
private static final UriMatcher URI_MATCHER;
static {
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI(AUTHORITY_ITEMS, "item", ITEMS);
URI_MATCHER.addURI(AUTHORITY_ITEMS, "item/#", ITEMS_ID);
}
Auf diese Weise kann, wenn nur 1 Ergebnis entscheiden kann, wird zurückgegeben oder aktualisiert werden oder wenn alle abgefragt werden soll oder nicht.
Die SQLiteOpenHelper wird der Einsatz tatsächlich durchführen und auch Pflege von Upgrades nehmen, wenn die Struktur Ihrer SQLite Datenbank ändert, können Sie es dort durch zwingende
ausführen könnenclass ItemDatabaseHelper extends SQLiteOpenHelper {
public ItemDatabaseHelper(Context context){
super(context, "myDatabase.db", null, ITEMDATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String createItemsTable = "create table " + TABLE_ITEMS + " (" +
...
");";
// Begin Transaction
db.beginTransaction();
try{
// Create Items table
db.execSQL(createItemsTable);
// Transaction was successful
db.setTransactionSuccessful();
} catch(Exception ex) {
Log.e(this.getClass().getName(), ex.getMessage(), ex);
} finally {
// End transaction
db.endTransaction();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String dropItemsTable = "DROP TABLE IF EXISTS " + TABLE_ITEMS;
// Begin transaction
db.beginTransaction();
try {
if(oldVersion<2){
// Upgrade from version 1 to version 2: DROP the whole table
db.execSQL(dropItemsTable);
onCreate(db);
Log.i(this.getClass().toString(),"Successfully upgraded to Version 2");
}
if(oldVersion<3) {
// minor change, perform an ALTER query
db.execSQL("ALTER ...");
}
db.setTransactionSuccessful();
} catch(Exception ex){
Log.e(this.getClass().getName(), ex.getMessage(), ex);
} finally {
// Ends transaction
// If there was an error, the database won't be altered
db.endTransaction();
}
}
}
und dann ist der einfachste Teil aller: Führen Sie eine Abfrage:
String[] rows = new String[] {"_ID", "_name", "_email" };
Uri uri = Uri.parse("content://com.yourname.yourapp.Items/item/2";
// Alternatively you can also use getContentResolver().insert/update/query/delete methods
Cursor c = managedQuery(uri, rows, "someRow=1", null, null);
Das ist im Grunde alles und der eleganteste Weg, um es so weit zu tun, wie ich weiß.