ما عبارة sqlite التي يمكن أن تنتج نتيجة للإشارة إلى الإدخالات المكررة؟ذكري المظهر

StackOverflow https://stackoverflow.com/questions/1634752

سؤال

بالنسبة لتطبيقي، أحاول إضافة إدخالات دون الحاجة إلى إدخال مكرر، وإذا كان هناك تكرار، فأخبر المستخدم واطلب منه المحاولة مرة أخرى.باستخدام SQLite، الذي لا أعرف عنه سوى القليل جدًا، جربت هاتين الطريقتين وأريد أن أعرف أيهما أفضل أو أكثر كفاءة أو أفضل طريقة لتطويره؟

الطريقة الأولى:

db.execSQL("INSERT INTO " + DatabaseHelper.DATABASE_TABLE + 
"(LATITUDE, LONGITUDE, RATING) SELECT " + latitude + ", " + longitude + ", " + rating +
" WHERE NOT EXISTS (SELECT 1 FROM " + DatabaseHelper.DATABASE_TABLE +
" WHERE LATITUDE = " + latitude + " AND LONGITUDE = " + longitude + ")");

الطريقة الثانية:

    long id = -1;
    try {
        id = db.compileStatement(
                "SELECT COUNT(*) FROM " + DatabaseHelper.DATABASE_TABLE
                        + " WHERE LATITUDE = " + latitude
                        + " AND LONGITUDE = " + longitude)
                .simpleQueryForLong();
    } catch (NullPointerException e) {
        return -1;
    }
    return id;

الطريقة الأولى، إما إدراج القيم أو تجاهلها، وأتحقق من خلال القيام بذلك، وتخزين عدد الصفوف في متغير قبل الاتصال، واستدعاء تلك الوظيفة، ثم التحقق من نتائجها.إذا لم تكن النتائج أعلى مما كانت عليه قبل المكالمة، فقد تم تجاهل الإدراج، قم بمطالبة المستخدم برسالة "القيم موجودة".(أعلم أن هذا أمر قذر للغاية، لكن الأوقات العصيبة تتطلب اتخاذ تدابير يائسة)

الطريقة الثانية، إرجاع العدد الفعلي للصفوف التي تطابق الأرقام التي أريد تخزينها، إذا كان الرقم أكبر من 1، فاطلب من المستخدم رسالة "القيم موجودة".

لقد كنت أتنقل ذهابًا وإيابًا، وأجرب طرقًا مختلفة ولكني لا أعرف كيفية إعداد SQLite للحصول على أزواج فريدة من نوعها، والتي قيل لي إنها ستكون الأسهل.إذا كان بإمكان أي شخص تصحيح أي من هذه الطرق و/أو التعليق عليها، فسيكون ذلك موضع تقدير كبير.

شكرًا

هل كانت مفيدة؟

المحلول 3

ولقد قررت أن أذهب مع وجهة نظري الثاني (انظر أعلاه)

والسبب الوجود منذ خلق UNIQUE INDEX يبدو أن عدم العمل بالنسبة لي وثبت أن يكون مهمة صعبة بالنسبة لي لإنجاز سواء كان ذلك نتيجة من وجهة نظري أو في سكليتي نهاية.

وانها الغرض ليس تافها، والنهج قد يكون الابتدائية ولكنه لا يفعل ما أنا في حاجة إليها للقيام به.

وآمل أن الناس تواجه مثل هذا الوضع يمكن أن تتأثر الإجابات غادر هنا وأتمنى لهم حظا أفضل معها مما كنت.

نصائح أخرى

إليك ما أفهم أنك تريده:للحصول على جدول Database_Table (ليس الاسم الأكثر وصفًا، إذا جاز لي أن أقول ذلك) والذي لن يسمح أبدًا بإدخال نفس زوج خطوط الطول والعرض لخطين.

إذا كان هذا صحيحًا، فأنت تريد الإعلان عن مفتاح أساسي أو مفتاح فريد يتضمن أعمدة خطوط الطول والعرض.إذا قمت بذلك، فإن أي محاولة لإدراج نفس الزوج ستؤدي إلى حدوث استثناء، والذي يمكنك التقاطه وبالتالي إخطار المستخدم.باستخدام هذه التقنية، لن تحتاج إلى استخدام عبارة WHERE NOT EXISTS (...) في استعلامك، فقط قم بإجراء INSERT عادي ودع SQLite ينبهك إلى انتهاك قيد UNIQUEness الخاص بك.

إذا كان جدولك موجودًا بالفعل، فيمكن إضافة المفتاح بسهولة باستخدام أمر SQL إنشاء فهرس.نظرًا لأنه قد يكون لديك مفتاح أساسي واحد فقط على أي طاولة، إذا كان لديك مفتاح أساسي على الطاولة بالفعل، فستحتاج إلى استخدام مفتاح فريد لهذا الغرض.

أبسط نموذج لعبارة CREATE INDEX التي ستستخدمها هو:

CREATE UNIQUE INDEX lat_long_unique ON Database_Table(latitude, longitude)

ويبدو لي أن استخدام الخام خطوط الطول / العرض ليس وسيلة رائعة للتحقق من التكرارات. كل / الجمع اللات الممكن طويلة باستخدام تنسيق GeoPoint 1E6 الروبوت يغطي مساحة قدرها شيء أقل من خمس بوصات مربعة. هذا الحجم هو، بطبيعة الحال، تختلف تبعا للمكان على وجه الأرض أنت واقف، ولكنه يجعل من سيادة الإبهام جيدة. لذلك يجب أن لا يقل عن محاصرة اللات الخاص بك / لفترة طويلة إلى أقرب عشرة، مائة أو ألف اعتمادا على حجم الشيء الذي تريد قياس.

وقبل أن تخزينها في قاعدة البيانات:

lat = (lat/1000)*1000; 
lon = (lon/1000)*1000;

إليك وسيلة جيدة لحساب المسافات بين نقاط خطوط الطول / العرض على الأرض:

http://jan.ucc.nau.edu/~cvm/latlongdist هتمل

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