سؤال

أنا أنظر إلى البرنامج التعليمي لـ Spatialite-Android, ، وألاحظ نماذج التعليمات البرمجية التالية:

String query = "SELECT AsText(Transform(MakePoint(" + TEST_LON + ", " + TEST_LAT + ", 4326), 32632));";
sb.append("Execute query: ").append(query).append("\n");
try {
    Stmt stmt = db.prepare(query);
    if (stmt.step()) {
        String pointStr = stmt.column_string(0);
        sb.append("\t").append(TEST_LON + "/" + TEST_LAT + "/EPSG:4326").append(" = ")//
                .append(pointStr + "/EPSG:32632").append("...\n");
    }
    stmt.close();
} catch (Exception e) {
    e.printStackTrace();
    sb.append(ERROR).append(e.getLocalizedMessage()).append("\n");
}

على وجه الخصوص، لاحظت أن الممارسة السيئة تتم ببساطة عن طريق تجميع استعلام SQL معًا، بدلاً من الطريقة الأكثر ملاءمة، مثل تلك المستخدمة من قبل مكتبة Android SQLite.هل هناك طريقة يمكنني من خلالها جعل Spatialite يستخدم البيانات المعدة بشكل صحيح؟

فقط للتوضيح، أنا أبحث عن شيء مثل هذا، باستخدام قاعدة بيانات SQLite القياسية في Android:

String query="SELECT * FROM table WHERE _id=?";
Cursor data=db.rawQuery(query,new String[]{id});
هل كانت مفيدة؟

المحلول

هناك بعض الحيل.جميعهم يستخدمون استدعاء exec()، الذي يحتوي على 3 وسيطات لهذا الإصدار.البيان من كود المصدر يكون:

public void exec(String sql, jsqlite.Callback cb, String args[])

إن jsqlite.Callback عبارة عن واجهة يمكن أن يكون هناك عدة منها.ولكن يبدو أن أفضل طريقة هي استخدام ملف db.get_table(query,args) وظيفة. %q هو البديل الفعال ل ? في تمثيل Android SQLite.إليك تحويل الكود المحدد:

String query = "SELECT AsText(Transform(MakePoint(%q, %q, 4326), 32632));";
TableResult result=db.get_table(query,new String[]{""+TEST_LONG,""+TEST_LAT});

ومن هناك، عليك فقط الحصول على النتائج من TableResult.لا يوجد استدعاء أسلوب للحصول على النتائج من هنا، بل يتعين عليك في الواقع الحصول على المتغير المعلن عنه بشكل عام وتحليله يدويًا.فيما يلي مثال على كيفية القيام بذلك.

TableResult result=db.get_table(query,new String[]{""+lng,""+lat});
Vector<String[]> rows=result.rows;
for (String[] row:rows)
{
    for (String val:row)
    {
        Log.v(TAG,val);
    }
}

إذا لم تكن تقوم بالتحديد، فجرّب شيئًا مثل هذا:

TableResult result=new TableResult();
db.exec("ATTACH DATABASE %q AS newDb",result,new String[]{path});

أفترض أن نفس النمط سيعمل مع INSERTS وما شابه

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