iphone - هواوي - موقع ايفون




بحث النص بطيئة جدا على سكليت دب على تابلفيو على اي فون (2)

لدي طاولة كبيرة من حوالي 2500 إدخالات. أنا عرض على تابلفيو. إلا أن شريط البحث بطيء جدا أثناء إجراء البحث الديناميكي. أي أنا تصفية الجدول في كل مرة يضع المستخدم في حرف على شريط البحث.

فيما يلي الرمز:

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
if([searchText length] > 0) {
    searching = YES;
    letUserSelectRow = YES;
    self.tableView.scrollEnabled = YES;
    [self searchTableView];
} else {
    searching = NO;
    letUserSelectRow = NO;
    self.tableView.scrollEnabled = NO;
    [whereClause setString: @"%%"];
}

[self.tableView reloadData];
   }


- (void) searchTableView {

NSString *searchText = searchBar.text;

[whereClause setString: @"%%"];
[whereClause appendString: searchText];
[whereClause appendString: @"%%"];

[self.tableView reloadData];
}

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


اختيار سكليت وعادة ما تكون سريعة جدا. إذا نشرت بعض طلبات البحث عن نماذج، فربما يكون من الأسهل مساعدتك.

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

2500 إدخالات في جدول ليست كبيرة ل سكليت. وسيكون مبلغ 000 000 25 دولار كبيرا.

عندما كنت تعمل مع سكليت، يمكنك اختبار الكثير من الأشياء على سطح المكتب باستخدام قذيفة sqlite3. على سبيل المثال، إذا كان طلب البحث يشبه:

SELECT * FROM MyTable WHERE Column='A';

يمكنك أن تفعل شيئا من هذا القبيل:

EXPLAIN QUERY PLAN SELECT * FROM MyTable WHERE Column='A';

إذا كنت ترى الناتج مثل هذا:

0|0|TABLE MyTable

وهذا يعني سكليت الزحف الجدول بأكمله للحصول على النتائج.

في هذه الحالة، من شأن إضافة فهرس أن يساعد:

CREATE INDEX MyTableColumn ON MyTable(Column);

ثم، فإن شرح أعلاه تعطيك شيئا من هذا القبيل بدلا من ذلك:

0|0|TABLE MyTable WITH INDEX MyTableColumn

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

CREATE INDEX MyTableFirstSecond ON MyTable(First,Second);

حتى في قضيتك:

  1. الحصول على قاعدة البيانات الخاصة بك على ماك.
  2. استخدم القشرة لتشخيص أي من طلبات البحث بطيئة.
  3. يمكنك دراسة الاستفسارات لمعرفة سبب بطئها: ما الذي يجب فهرسته؟ وأقل احتمالا: ماذا عن الاستعلام أمر محرج، ومنع محسن الاستعلام من اختيار خطة معقولة؟
  4. إضافة الفهارس المناسبة أو ضبط الاستعلام.
  5. إعادة الاختبار للتأكد من أن التغيير يعمل.

قاعدة الإبهام مع سكليت بسيطة: إذا كنت تريد الذهاب للبحث عن ذلك، فإنه ينبغي أن تكون مفهرسة.


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

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

بريديكات = [نسبريكات بريديكاتويثفورمات: @ "فولنام كونتينز [سد]٪ @ أور إمايلادريسسترينغ كونتينز [سد]٪ @"، سيرشسترينغ، سيرشسترينغ]؛

نساراي * ريسولترااراي = [[نساراي ألوك] إينتيتويثاراي: [آل كونتاكتس فيلتيردرايوسينسبريديكات: بريديكات]]؛