Самый быстрый способ вставить слова в UserDictionary - PullRequest
1 голос
/ 15 февраля 2012

Я бы хотел, чтобы приложение добавило несколько (2k) слов в UserDictionary.

Я экспериментировал с ContentResolver (). Insert / bulk insert ....

// array of words
    String[] words = getResources().getStringArray(R.array.word_array); 

    Long start,end = null;

    start = System.currentTimeMillis();


    int len = words.length;
    ContentValues[] mValueArray = new ContentValues[len];
    ContentValues mNewValues = new ContentValues();

    mNewValues.put(UserDictionary.Words.APP_ID, "com.my.example");
    mNewValues.put(UserDictionary.Words.LOCALE, "en");
    mNewValues.put(UserDictionary.Words.FREQUENCY, "100");

    for (int i = 0; i < len; ++i) {

        mNewValues.put(UserDictionary.Words.WORD, words[i]);

        mValueArray[i] = mNewValues;
    }

    getContentResolver().bulkInsert(
            UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
           mValueArray                       // the values to insert
        );
   end = System.currentTimeMillis();

   Toast toast = Toast.makeText(this, "Time for " + Integer.toString(len-1)+" words: " + Long.toString((end-start)) + "ms", 50);
   toast.show();

На моемТелефон занимает около 100 мс на слово, если я выполняю bulkinsert партиями по 100. 3+ минуты, чтобы вставить 2 тыс. слов.

Кто-нибудь знает о более быстром способе ввода слов или какой-либо оптимизации, которую можно выполнить?

Дополнительный вопрос: существует ли верхний предел размера UserDictionary или это зависит от телефона?

Любая помощь приветствуется

Michealster

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Специфично для вашего случая: добавление 2000 слов в словарь с растяжкой займет много времени, и оптимизация практически невозможна.Время, которое вы видите здесь, относится к файловой операции и переходу от Java-> NDK-> Native.

Общие сведения: независимо от используемого метода, нужно понимать, что это не что иное, как файловые операции, и оно связанозанять время.API (в том числе связанные с SQLite) являются просто оболочкой для намеченных файловых операций в собственном коде.Собственная запись в файл всегда занимает больше времени, чем чтение файла.

1 голос
/ 15 февраля 2012

Я видел в источниках Android, что для больших запросов sql используется метод applyBatch.В некоторых других программах, таких как ContactsRemover, авторы также используют этот метод.Но я не знаю, действительно ли он быстрее, чем insert или bultInsert.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...