سؤال

أعلم أنه يمكنك استخدام 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); 

هذا كل شيء والطريقة الأكثر أناقة للقيام بذلك بقدر ما أعرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top