باستخدام Python في Android للواجهة إلى SQL
-
25-09-2019 - |
سؤال
أعلم أنه يمكنك استخدام Python ولغات البرمجة النصية الأخرى في Android. لكنني لم أر الطقس أو لم يكن من الممكن استخدام Python كواجهة لـ SQLite في Android. هل هذا ممكن؟ هذا هو أول تطبيق Android حيث كنت بحاجة إلى SQLite ، واستخدام Java API's متخلف.
إذا لم يكن ذلك ممكنًا ، فهل يمكن لأي شخص أن يوجهني إلى برنامج تعليمي جيد على SQLite في Android؟ لقد وجدت حفنة ، لكن جميعها مختلفة تمامًا وأنا ضائع تمامًا ، وهي أفضل طريقة للقيام بذلك.
من الصعب أن تصور كيف تتوقع Google أن تستخدم قاعدة بيانات SQLite. يبدو أنك بحاجة مثل 10 فئات مختلفة فقط للاستعلام عن قاعدة بيانات.
المحلول
في الواقع تحتاج فقط إلى 3 فصول:
أ ContentProvider, ، كما وجدت هنا: http://developer.android.com/guide/topics/providers/content-providers.html
الثاني الذي تحتاجه هو أ sqliteopenhelper وأخيرا وليس آخرا المؤشر
تحرير: لاحظت للتو أنه ليس من الواضح من المقتطفات ما db
المتغير هو. إنه sqliteopenhelper أو أفضل امتداده له (حيث قمت فقط بالتغلب على 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;
}
يتم تعريف 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);
}
وبهذه الطريقة ، يمكنك أن تقرر ما إذا كانت النتيجة واحدة فقط يتم إرجاعها أو تحديثها أو ما إذا كان ينبغي الاستعلام عن الجميع أم لا.
سيقوم 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);
هذا كل شيء والطريقة الأكثر أناقة للقيام بذلك بقدر ما أعرف.