2012-03-19 4 views
0

Я получаю исключение NullPointerException в отмеченном в коде.SQLiteDatabse, предоставляющий NullPointerException

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

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 лакх слов. Возможно ли создать базу данных один раз и сохранить ее навсегда, чтобы можно было получать значения без повторного создания базы данных снова и снова при запуске проекта.

+0

Где находится ваш прогрессDialog? Я не вижу этого в приведенном выше коде. – Rajkiran

+0

Извините за заголовок. –

ответ

0

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

wordDB.startTransaction(); 
try { 

    /*while loop*/ 

    wordDB.setTransactionSuccessful(); 
} finally { 
db.endTransaction(); 
} 
+0

Исключение все еще бросается. –

Смежные вопросы