SQLiteDatabse дает исключение NullPointerException - PullRequest
0 голосов
/ 19 марта 2012

Я получаю исключение NullPointerException в отмеченном в коде.

Код обычно читает текстовый файл в необработанной папке в проекте и вставляет содержимое в таблицу базы данных.Текстовый файл в папке raw содержит список английских слов для проверки правописания.Может ли кто-нибудь помочь мне в этом вопросе.

public class WordsDB
{
    private static final String FTS_WORD_DB="FTS_WORD_DB";
private static final String WORD="WORD";
private static final String FTS_WORD_DB_CREATE="CREATE VIRTUAL TABLE "+FTS_WORD_DB+" USING ft3 ("+WORD+");";
private static final String WORD_DATABASE="WORD_DATABSE";
private static final int DATABSE_VERSION=1;
private WordsDBLoadHelper helper;
public static SQLiteDatabase wordDb;

public WordsDB(Context context)
{
    helper=new WordsDBLoadHelper(context);
}

public void load()
{
    helper.loadWordDb();
}

public class WordsDBLoadHelper extends SQLiteOpenHelper
{   
    public WordsDBLoadHelper(Context context)
    {
        super(context, WORD_DATABASE, null, DATABSE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        wordDb=db;
        wordDb.execSQL(FTS_WORD_DB_CREATE);
    }

    public void loadWordDb()
    {
        Resources resource=SearchDict.context.getResources();
        InputStream is=resource.openRawResource(R.raw.wordlist);
        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        String line;
        try
        {
            while((line=br.readLine())!=null)
            {
                addWord(line.trim());
            }
        }
        catch (Exception e)
        {
            Log.e(null, e.getStackTrace().toString(), e);
        }
    }

    public void addWord(String line)
    {
        try
        {
            ContentValues values=new ContentValues();
            values.put(WORD, line);
            wordDb.insert(FTS_WORD_DB, null, values);
        }
        catch(Exception e)
        {
            Log.e(null, e.getStackTrace().toString(), e);
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {   
    }
}
}

Есть ли более быстрый способ для создания таблицы и вставки значений в нее.Вышеупомянутая процедура занимает около часа, чтобы вставить значения в базу данных, потому что текстовый файл содержит более 3 слов lakh.Можно ли создать базу данных один раз и сохранить ее постоянно, чтобы можно было извлекать значения без повторного создания базы данных при запуске проекта.

1 Ответ

0 голосов
/ 19 марта 2012

В Sqlite вставки обычно довольно быстрые, но коммиты медленные.Вы не используете транзакцию, поэтому после каждой вставки sqlite выполняет коммит.

wordDB.startTransaction();
try {

    /*while loop*/

    wordDB.setTransactionSuccessful();
} finally {
 db.endTransaction();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...