当前位置: 首页 > 知识库问答 >
问题:

Android开发:将txt中的单词添加到数据库中,错误显示未捕获的异常,已使用IOE并尝试捕获,但仍不成功。

西门展
2023-03-14

我要做的是:将我的单词.txt(保存在res/raw/words.txt中)中的单词插入到我的数据库中。单词.txt文件如下所示:

commission
camera
mouse

每行一个字。

问题似乎出在fillDB方法中,因为我的Logo. d能够在logcat中注册。尽管如此,我仍然发布了我的整个DBHelper.java,以防错误不存在:

public class DBHelper extends SQLiteOpenHelper {

私有静态最终字符串 TAG = “WordDatabase”;

//Table names;
public static final String T_NAME = "WORDS";
public static final String T2_NAME = "SCORE";

//Column names
public static final String C_WKEYS = "Word Keys";
public static final String C_WORDS = "List of Words";
public static final String C_SKEYS = "Score Keys";
public static final String C_SCORE = "Score";

//Database info
public static final String DB_NAME = "letterhunter.db";
public static final int DB_VERSION = 1;

private final Context context;
private SQLiteDatabase db;

public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    this.context = context;
        // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    String sql = String.format("create table %s " + "(%s integer primary key, %s text)" , T_NAME, C_WKEYS, C_WORDS);
    Log.d (TAG , "create sql "+sql);    
    db.execSQL(sql);

    fillDB();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("drop if exists " + T_NAME);
    onCreate(db);
}

private void fillDB(){

    new Thread(new Runnable(){

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                loadWords();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }).start();

}   

private void loadWords() throws IOException{
    Resources resources = context.getResources();
    InputStream is = resources.openRawResource(R.raw.words);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));      
    Log.d("here", "baby");      
        String word;
        try {
            while((word=br.readLine()) != null){
                ContentValues values = new ContentValues();
                values.put(C_WKEYS, 0);
                values.put(C_WORDS, word);

                db.insert(T_NAME, null, values);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    br.close();
    is.close(); 
}

}

logcat如下所示:

04-29 18:29:33.748: D/WordDatabase(899): create sql create table WORDS (Word Keys integer primary key, List of Words text)
 04-29 18:29:33.748: D/here(899): baby
 04-29 18:29:33.748: W/dalvikvm(899): threadid=11: thread exiting with uncaught exception (group=0x4161c8b0)
04-29 18:29:33.758: E/AndroidRuntime(899): FATAL EXCEPTION: Thread-12681
04-29 18:29:33.758: E/AndroidRuntime(899): java.lang.NullPointerException
04-29 18:29:33.758: E/AndroidRuntime(899):  at com.johnyeung.letterhunter.DBHelper.loadWords(DBHelper.java:90)
04-29 18:29:33.758: E/AndroidRuntime(899):  at com.johnyeung.letterhunter.DBHelper.access$0(DBHelper.java:78)
04-29 18:29:33.758: E/AndroidRuntime(899):  at com.johnyeung.letterhunter.DBHelper$1.run(DBHelper.java:67)
04-29 18:29:33.758: E/AndroidRuntime(899):  at java.lang.Thread.run(Thread.java:841)
04-29 18:29:33.808: D/libEGL(899): loaded /vendor/lib/egl/libEGL_adreno.so
04-29 18:29:33.818: D/libEGL(899): loaded /vendor/lib/egl/libGLESv1_CM_adreno.so
04-29 18:29:33.818: D/libEGL(899): loaded /vendor/lib/egl/libGLESv2_adreno.so
04-29 18:29:33.818: I/Adreno-EGL(899): <qeglDrvAPI_eglInitialize:316>: EGL 1.4 QUALCOMM build:  (CL4169980)
04-29 18:29:33.818: I/Adreno-EGL(899): OpenGL ES Shader Compiler Version: 17.01.10.SPL
04-29 18:29:33.818: I/Adreno-EGL(899): Build Date: 12/01/13 Sun
04-29 18:29:33.818: I/Adreno-EGL(899): Local Branch: 
04-29 18:29:33.818: I/Adreno-EGL(899): Remote Branch: 
04-29 18:29:33.818: I/Adreno-EGL(899): Local Patches: 
04-29 18:29:33.818: I/Adreno-EGL(899): Reconstruct Branch: 
04-29 18:29:33.868: D/OpenGLRenderer(899): Enabling debug mode 0
04-29 18:34:33.801: I/Process(899): Sending signal. PID: 899 SIG: 9

共有2个答案

贺俊杰
2023-03-14

正如@laalto所说-使用< code > getWritableDatabase()

我在适用于数据库的方法中使用它,就像在您的代码中一样:

private void loadWords() throws IOException{
    Resources resources = context.getResources();
    InputStream is = resources.openRawResource(R.raw.words);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));      
    Log.d("here", "baby");      
        String word;
        try {
            //add here:
            db.getWritableDatabase(); //this opens and(if necessary) creates your DB
            while((word=br.readLine()) != null){
                ContentValues values = new ContentValues();
                values.put(C_WKEYS, 0);
                values.put(C_WORDS, word);

                db.insert(T_NAME, null, values);
            }
            //add that too:
            db.close(); //you should close your DB, when you don't need it for this moment
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    br.close();
    is.close(); 
}
齐鸿光
2023-03-14

您尚未初始化私有SQLiteDatabase数据库 loadWords()中使用的code>成员变量。

使用 getWritableDatabase() 在线程中初始化它。不要在 onCreate() 或 onUpgrade() 调用的方法中调用 getWritableDatase(),因为这不起作用。

 类似资料:
  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • Twilio新手使用测试帐户。我按照这里列出的安装Twilio PHP的说明进行了安装:https://www.Twilio.com/docs/quickstart/php/sms 因为我得到了一个证书错误,所以我的主机提供程序建议我更改CURLOPT_SSL_VERIFYPEER=>false(从true改为true)。但现在我得到了这个错误。如何修复?:致命错误:未捕获异常“services_

  • 问题内容: 我知道可可中有一个UncaughtExceptionHandler,但是我正在为Swift寻找相同的东西。即,每当应用程序中有任何错误/异常由于任何错误而未在本地捕获时,它应该一直冒泡到顶级应用程序对象,在那里我应该能够妥善处理它并适当地响应用户。 Android有它。Flex有它。Java有它。想知道为什么Swift缺少此关键功能。 问题答案: Swift没有机制来捕获所有任意的运行

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。

  • 我的RMI服务器接口声明了一个方法foo(),该方法被声明为引发RemoteException和Exception,如下所示: 服务器实现为: 我的客户端在服务器上调用foo: 现在,当我运行客户端时,我得到: 从java类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时 Java文档是这样说的。rm