Лучшие методы SQLite на [закрытом] iPhone

В вашем вопросе упоминается JSON. Итак, я обратился к этому. Дайте мне знать, если это поможет.

import json
import os
import glob
import pprint
keywordList = []
path = '/Users/Me/Api/downloaded'
for filename in glob.glob(os.path.join(path, '*.json')): #only process .JSON files in folder.      
    with open(filename, encoding='utf-8', mode='r') as currentFile:
        data=currentFile.read().replace('\n', '')
        keyword = json.loads(data)["keytolookup"]
        if keyword not in keywordList:
            keywordList.append(keyword)
pprint(keywordList)

РЕДАКТИРОВАТЬ примечание : обновленное изменение ответа для цикла по сравнению с первоначальным ответом:
for filename in os.listdir(path)
OP упомянутой версии глоба работает лучше. Это тоже было в качестве альтернативы.

9
задан Coocoo4Cocoa 17 May 2009 в 15:27
поделиться

7 ответов

Я могу порекомендовать использовать FMDB в качестве красивой оболочки Cocoa SQLite.

8
ответ дан 4 December 2019 в 08:16
поделиться

Вне моей головы:

  • Использовать транзакции.
  • Убедитесь, что ваш SQL использует таблицы в правильном порядке .
  • Не добавляйте индексы, в которых вы не совсем уверены.

Возможно, не только для iPhone, но и для встроенных устройств. Здесь есть несколько полезных советов .

Эта ссылка относится к старая версия SQLite, но все еще оказывается полезной.

Наконец, этот вопрос стека также содержит некоторую полезную информацию.

В настоящее время мы используем SQLite с приложением .Net Compact Framework, и его производительность фантастическая, и мы ' Я потратил немного времени на оптимизацию, но не настолько, насколько мы могли бы.

Удачи.

6
ответ дан 4 December 2019 в 08:16
поделиться

Измерьте объем памяти, занимаемый вашим приложением, и найдите утечки в инструментах. Затем попробуйте это после вызова sqlite3_exec с:

  • pragma cache_size = 1

и / или

  • pragma synchronous = 0

YMMV. Есть отчеты о повышении производительности, значительном сокращении использования ОЗУ и меньшем количестве утечек. Однако будьте осторожны при внесении корректировок, не осознавая воздействия (например, синхронный отключает промывку, что значительно ускоряет работу, но может вызвать повреждение базы данных, если телефон был выключен и снова выключен в неправильное время) .

Подробнее здесь: http://www.sqlite.org/pragma.html

8
ответ дан 4 December 2019 в 08:16
поделиться

Я обнаружил, что часто быстрее просто получить идентификатор I ' я ищу в сложном запросе, а затем получаю остальную информацию по запросу.

Так, например:

SELECT person_id
  FROM persons
 WHERE (complex where clause)

, а затем, когда отображается каждый человек, я запускаю

SELECT first_name, last_name, birth_date, ...
  FROM persons
 WHERE person_id = @person_id

Я обычно нахожу, что это усложняет запрос выполняется за половину времени, и поиск для данного человека обычно составляет порядка 2 мс (это для таблиц с 17 тыс. строк).

Ваш опыт может отличаться, и вы должны рассчитывать время самостоятельно.

Также , http://www.vimeo.com/4421498 .

На самом деле я широко использую шаблон гидратации / дегидратации из sqlitebooks, который является расширенным набором этой техники.

3
ответ дан 4 December 2019 в 08:16
поделиться

Еще один вариант, который я еще не пробовал, это Core Data (должен быть разработчиком Apple iphone), хотя это функция версии 3.0, поэтому от вашего приложения зависит, будет ли это вариант.

0
ответ дан 4 December 2019 в 08:16
поделиться

Я ленив и люблю как можно больше придерживаться основного кода, поэтому мне нравится инструмент ORM SQLitePersistentObjects:

http://code.google.com/p/sqlitepersistentobjects /

Вы заставляете объекты вашей модели предметной области унаследовать от SQLitePersistentObject (хорошо, немного навязчиво), а затем вы можете сохранять / извлекать ваши объекты по мере необходимости.

Для сохранения:

[person save];  

Загрузить его обратно почти так же просто. К любому устойчивому объекту добавляются методы динамического класса, позволяющие выполнять поиск. Итак, мы могли бы получить все объекты Person с фамилией «Смит» следующим образом:

NSArray *people = [PersistablePerson findByLastName:@"Smith"];
1
ответ дан 4 December 2019 в 08:16
поделиться

PLDatabase - это альтернатива FMDB: http://code.google.com/p/pldatabase/

Я без проблем использовал ее в одном из моих проектов.

0
ответ дан 4 December 2019 в 08:16
поделиться