2011-08-02 12 views
0

私のデータベースにアイテムを挿入する際に問題が発生しました。プログラムが4行で実行され、正常に挿入されるのは本当に奇妙ですが、5行目でクラッシュし、アプリケーションまたはカーソルの3つのレポートが閉じられませんでした。私のコードでは、カーソルとデータベースの両方を閉じて再オープンしているので、これがどう起こっているのか本当に混乱しています。ここにコードがあります。Androidアプリケーションがカーソルまたはデータベースを閉じなかった

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode) { 
     case REQUEST_CODE_NEW: 
      if (resultCode == -1) { 
       Integer chapterId = data.getIntExtra("chapterId", -1); 
       Toast toast = Toast.makeText(this, "Selected Chapter: " + chapterId.toString(), Toast.LENGTH_LONG); 
       if (chapterId != -1) { 
        DbHelper db = new DbHelper(this); 
        for (int i = 0; i < questions.getTitle().size(); i++) { 
         db.insertQuestion(chapterId.toString(), questions.getTitle().get(i), questions.getAnswer().get(i), questions.getAr().get(i)); 
        } 
       } 
       toast.show(); 
      } 
      break; 
    } 
} 

これは、dbhelperクラスを使用してデータベースを作成することです。ここで私は無駄にまだ良い、それを管理しようとするが、ことができますので、私はクラスレベルでカーソルを置くデータベースヘルパー

public void insertQuestion(String cat_id, String title, String answer, String article) { 
    db.execSQL("INSERT INTO " + QUESTION_TABLE_NAME + " (title,answer,article,picture) VALUES ('" + title + "','" + answer + "','" + article + "','none')"); 
    String id = getQuestionId(title); 
    db.execSQL("INSERT INTO " + REL_TABLE_NAME + " (question_id, cat_id) VALUES (" + id + "," + cat_id + ")"); 

} 
public String getQuestionId(String title) { 
    String id; 
    cursor = this.db.rawQuery("SELECT question_id FROM " + QUESTION_TABLE_NAME + " WHERE title = '" + title + "' LIMIT 1", null); 
    cursor.moveToFirst(); 
    id = cursor.getString(0); 
    cursor.close(); 
    db.close(); 
    return id; 
} 

です。その4つのクエリの後もクラッシュしています。

+0

あなたがgetQuestionIdであなたのDBを閉じてからエラーが出るいけませんか...? db.closeはgetQuestionId()の中でなく、forループの終了から呼び出されるべきです。 –

+0

クラッシュを示すlogcat出力を送信します。何が問題なのかを示すクラッシュの根本的な原因が存在します。 – Femi

+0

私は、実行されたクエリを見るときに問題を理解したと思います。そこには複数の単語やその他のものがあります。 PHPのようにそれらをエスケープする簡単な方法はありますか? – Shaun

答えて

1

は、この "修正" を試してみてください。

DbHelper db = new DbHelper(this); 
try{ 
        for (int i = 0; i < questions.getTitle().size(); i++) { 
         db.insertQuestion(chapterId.toString(), questions.getTitle().get(i), questions.getAnswer().get(i), questions.getAr().get(i)); 
        } 
}catch(Exception e1){ 
    android.util.Log.v("DbHelper Error","Crash: "+e1.getMessage(), e1); 
}finally{ 
db.close(); 
} 
+0

問題は、挿入しようとしていた文字列に 'がありました。それをエスケープして、データベースから再度読み込んだときに戻す方法はありますか?私はhtmlで、私はちょうどhtmlのequivelantを使用することができます知っているが、SQLiteとJavaはどう? – Shaun

+0

ええ、ContentValuesクラスを使用して挿入を行います。例についてはhttp://www.vogella.de/articles/AndroidSQLite/article.html#todo_databaseを参照してください。これは正しくエスケープします。 – Femi

関連する問題