Использование Python в Android для взаимодействия с SQL - PullRequest
0 голосов
/ 27 сентября 2010

Я знаю, что вы можете использовать Python и другие языки сценариев в Android. Но я не видел погоду или не было возможности использовать Python в качестве интерфейса для SQLite в Android. Это возможно? Это первое приложение для Android, где мне понадобился sqlite, и использование Java-API замедляется.

Если это невозможно, может кто-нибудь указать мне хороший учебник по sqlite в Android? Я нашел кучу, но все они совершенно разные, и я совершенно заблудился, что является лучшим способом сделать это.

Просто сложно представить, как Google ожидает, что вы будете использовать базу данных sqlite. Кажется, вам нужно 10 разных классов только для запросов к базе данных.

1 Ответ

1 голос
/ 28 сентября 2010

На самом деле вам просто нужно 3 класса:

A ContentProvider , как показано здесь: http://developer.android.com/guide/topics/providers/content-providers.html

Второй вам нужен SQLiteOpenHelper и последнее, но не менее важное: Курсор

Редактировать: Только что заметил, что из фрагментов не очевидно, что такое переменная db.Это SQLiteOpenHelper или, что лучше, его расширение (где я переопределил только onCreate, onUpgrade и конструктор. См. Ниже ^^

ContentProvider будет взаимодействовать с базой данных и выполнятьвставки, обновления, удаления. Поставщик контента также разрешит другим частям вашего кода (даже другим приложениям, если вы разрешите) доступ к данным, хранящимся в sqlite.

Затем вы можете переопределить вставку /удалять / запрашивать / обновлять функции и добавлять к ним свои функции, например выполнять различные действия в зависимости от URI намерения.

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;
}

UriMatcher определяется как

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);
}

Thisвы можете решить, будет ли возвращен или обновлен только 1 результат, или все должны быть запрошены или нет.

SQLiteOpenHelper фактически выполнит вставку и также позаботится об обновлениях, если структура вашей базы данных SQLite изменится,Вы можете выполнить это, переопределив

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();
        }
    }
}

и затем самую простую частьиз всех: Выполнить запрос:

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); 

Это, по сути, все и самый элегантный способ сделать это, насколько я знаю.

...