【问题标题】:SQLiteDatabse giving NullPointerExceptionSQLiteDatabse 给出 NullPointerException
【发布时间】:2012-03-19 16:24:07
【问题描述】:

我在代码中的标记中得到 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)
    {   
    }
}
}

有没有更快的方法来创建表并将值插入其中。上述过程大约需要一个多小时才能在数据库中插入值,因为文本文件包含超过 30 万个单词。 是否可以一次创建数据库并永久存储,以便在项目运行时无需一次又一次地重新创建数据库即可检索值。

【问题讨论】:

  • 你的progressDialog在哪里?我在上面的代码中看不到。

标签: android sqlite nullpointerexception


【解决方案1】:

在 Sqlite 中,插入通常很快,但提交很慢。您没有使用事务,因此在每个插入 sqlite 执行提交之后。

wordDB.startTransaction();
try {

    /*while loop*/

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

【讨论】:

  • 异常仍在抛出。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多