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.

War es hilfreich?

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önnen
class 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ß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top