Вопрос

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

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

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

Это было полезно?

Решение

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

А. Поставщик услуг, как найдено здесь: http://developer.android.com/guide/topics/providers/content-providers.html.

Во-вторых, вам нужно SQLiteopenheelper и последнее, но не менее важное Курсор

Редактировать: только заметил, что не очевидно из фрагментов, что db Переменная есть. Это SQLiteOpenheelper или лучше мое расширение от него (где я только переопределил oncreate, OnupGrade и Constructor. Смотрите ниже ^^

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

Уриматтер определяется как

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

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

SQLiteopenheelper фактически выполнит вставку, а также позаботится об обновлениях, если структура вашей базы данных 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); 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top