2016-08-24 9 views
0

私はEditTextに質問を挿入し、答えとして文字列を返す 'Talk to the Flash'アプリケーションを作成しています。質問と回答を同じテーブルに保存したデータベースを作成しましたが、それぞれの質問とそれに対応する回答が同じ行にある別の列にあります。SQLiteデータベースを使用しようとするとAndroidアプリがフリーズします

私の問題は、アプリケーションを実行しようとすると、入力された質問の回答を探すボタンを押すとフリーズする(answerToQuestionメソッドを使用して質問をパラメータとして渡す)

解決策を探してみましたが見つかりませんでした。

これは私のデータベースハンドラクラス(その中にコピーされたすべてのもの)である:

package com.beacon.talktotheflash; 

import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.Cursor; 
oimport android.content.Context; 

public class MyDBHandler extends SQLiteOpenHelper{ 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "flash.db"; 
private static final String TABLE_QANDA = "questions_and_answers"; 
private static final String COLUMN_ID = "id"; 
private static final String COLUMN_QUESTIONS = "questions"; 
private static final String COLUMN_ANSWERS = "answers"; 

public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

// Initializes the database 
@Override 
public void onCreate(SQLiteDatabase db) { 
String query = "CREATE TABLE " + TABLE_QANDA + "(" + 
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
COLUMN_QUESTIONS + " TEXT, " + 
COLUMN_ANSWERS + " TEXT);"; 
db.execSQL(query); 
listOfQandA(db); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
db.execSQL("DROP TABLE IF EXISTS " + TABLE_QANDA); 
onCreate(db); 
} 

// List of the questions and answers 
public void listOfQandA(SQLiteDatabase db){ 
String query = "INSERT INTO " + TABLE_QANDA + " (" + COLUMN_QUESTIONS + ", " + COLUMN_ANSWERS + ") " 
+ " VALUES(\"hello\", \"Hi says the Flash!\")"; 

db.execSQL(query); 
} 

// Get the answer for the provided question 
public String answerToQuestion(String question){ 
// Check if the question and the answer are in the same row 
// by using a cursor 
SQLiteDatabase db = getWritableDatabase(); 
String final_answer = ""; 
String query1 = "SELECT " + COLUMN_QUESTIONS + " FROM " + TABLE_QANDA + " WHERE 1"; 
String query2 = "SELECT " + COLUMN_ANSWERS + " FROM " + TABLE_QANDA + " WHERE 1"; 

// Cursor point to a location in a column 
Cursor c1 = db.rawQuery(query1, null); 
Cursor c2 = db.rawQuery(query2, null); 

// Move to the first row in column_questions 
c1.moveToFirst(); 

while(!c1.isAfterLast()){ 
if (c1.getString(c1.getColumnIndex("questions")).equals(question)){ 
int c1_position = c1.getPosition(); 
c2.moveToPosition(c1_position); 
final_answer = c2.getString(c2.getColumnIndex("answers")); 
} 
} 

c1.close(); 
c2.close(); 

return final_answer; 
} 
} 
+2

長時間実行する操作は、別のスレッドで実行する必要があります。 –

+0

私はこの質問に何もないが、あなたは[Realm.io](https://realm.io/docs/java/latest/)について既に聞いていましたか?これはSQLliteの素晴らしいフレームワークです。 –

答えて

2

あなたが無限ループしています。あなたはc1でmoveToFirstを実行しますが、決してmoveToNextを使用しません。だから、あなたは後になることは決してありません。

+0

それは動作します!カーソルを次のものに移動させて、それは動作します!ありがとう、百万、それを把握しようと私に1日かかった。 – arcode

+0

@arcodeこの回答はあなたの質問に答えているようですので、左の評価の下にある小さなチェックマークを付けて答えてください。これは、あなたが答えに満足していることを他人に知らせるためのマーカーとして使用されます。ようこそ –

関連する問題