Использование Python в Android к интерфейсу на SQL
-
25-09-2019 - |
Вопрос
Я знаю, что вы можете использовать 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);
Это в основном все и самый элегантный способ сделать это, насколько я знаю.